本人做的一个程序,是数据采集和实时监控的,需要连续运行,并且会在运行中产生大量的线程,处理完后线程就退出。现在这个程序在很多客户处运行,有的会在连续运行7、8天后出错,有的连续运行20、30天后出错,有的几个月也不出错。 错误提示都是非法内存访问。查不出哪里出问题了。在写这样的程序时,需要注意些什么东西?

解决方案 »

  1.   

    楼上的仁兄说的这个,应该是另类的重点了(泄漏问题这是必不可少的得处理的)考虑某时刻并发数据量大的时候会不会崩溃以及一些网络异常另还提点自己的看法处理线程的同步与互斥时一定记得CloseHandle吧,我想这方面也有影响的
      

  2.   

    内存可以一上来就定个最大值,只在一上来的时候创建,运行过程中不要动态创建最安全
    线程多的话,换用IOCP吧
      

  3.   

    想要稳定性的话,要注意一下几个原则<1> 禁止频繁申请释放外部资源(包括,内存,I/O,文件,线程等均为外部资源)
    <2> 足够的异常处理第一条的意思是:
    对内存来说:频繁申请/释放大块的内存,会导致内存碎片的产生,最终导致操作系统的内存资源枯竭,或者某一个时刻内存不足.(此时你直接或间接使用内存的代码将出现异常)
    对I/O来说:频繁打开/关闭IO,除非理论上IO为绝对可靠(实际任何操作,包括内存的可靠均为相对可靠,没有绝对可靠),那么你中途打开/关闭IO的时候,将出现异常.  另外你也容易上在你底下的开发IO服务的供应商也容易犯第一条错误
    对文件来说:频繁申请/释放文件的话,在你中途再次申请的时候,有机会打开失败(如被别人占用,操作系统自身申请超时,硬盘内存工作超时等等)
    对线程来说:创建,关闭线程是会导致操作系统有内存,CPU分配开销的,会导致频繁申请/释放内存,句柄等系统资源,非常有机会出现资源不足总的来说,避免频繁的申请/释放资源操作,有这种操作的就是意味着你的程序是不稳定,容易收到外界影响第二条的意思:
    做的再好的外部接口(底层服务程序,硬件,数据库,操作系统接口等等)也会偶尔出现工作异常,但是这个高强度的应用程序是不容许这个偶尔的
    总的来讲:若在你的观念中认为打交道的外部接口都不是可靠,那么你的程序空间内部往往可以做的可靠
    我的经验:
    申请的资源在使用后要尽快释放:在一般的商业级应用是正确的,在工业级设计中是错误的
    申请的资源在完全不用时才释放:在一般的商业级应用是错误的,在工业级设计中是正确的商业级的应用程序:计算机资源为大家共享
    工业级的应用程序:计算机资源为你独占商业级应用:应该打造一个弹性系统,以便跟其他开发商的应用程序共存,共同发挥整个计算机的性能
    工业级应用:应该打造一个刚性系统,只管你的应用程序稳定,不管别的开发商应用程序的死活
      

  4.   

    强烈建议,不要使用windows操作系统。非常非常强烈的建议......
      

  5.   

    flowlight(流光) 
    你的建议很精彩,能结识一下吗? [email protected]
    和楼主同样的处境,
    真的感觉:做一个系统很容易,但做一个可以长时间稳定运行的后台系统太难了,
    我的一个系统由于有多个处理模块构成,稳定性让我焦头烂额