莫名其妙的问题,困扰我很久了,非常着急。现金悬赏,价格你开。c#开发的一个互联网搜索系统,几十个多线程并发运行。单独模块的测试都结束了,在系统整体试运行时,会不定期的产生僵死。僵死发生时,CPU使用率、下行带宽使用率均瞬时降为0。发生僵死后,系统界面无法刷新,显示为白屏。此时如果Visual Studio进行“中断”命令,Visual Studio也会一并失去响应。除非用“任务管理器”强行关闭测试系统,Visual Studio才能恢复响应。僵死后,不论多长时间都不会自行恢复正常。包括Visual Studio2003,Visual Studio2005都会发生同样情况。硬件描述:4核CPU,4G内存。下行带宽几M。在正常运行状态下,CPU使用率维持在50%~70%左右,4核使用率较为均衡,一般不会瞬时冲高到100%。在正常运行状态下,内存(包括虚拟内存)占用500M左右,也不会产生瞬时内存过大的情况。为了避免低效的IO硬盘操作影响系统速度,系统采用集中IO操作的机制,定时进行硬盘写入,但也会有零碎的硬盘读写发生,但量不会大。可以排除的一些常见原因:死锁、死循环、内存不足,机器硬件错误(因为2台测试机器均发生同样情况)、CPU负担过重、IE页面报错对话框的问题。
附带的一个问题:System.OutOfMemoryException 错误。虽然已经在配置文件\Aspnet.config 加入 <gcServer enabled="false" /> (工作站模式),但还是会偶尔出现这种错误,发生这种错误提示的时候,系统的内存使用大概在500M左右。会不会是因为c#对内存管理机制的问题导致出现这种僵死的发生?
不知道能否有什么调试、监测工具进行错误监测?同一个问题的另外一贴:http://topic.csdn.net/u/20090807/09/fdd894cd-1cfd-4e00-badf-c2f6e6b320e7.html 。

解决方案 »

  1.   

    4G内存都会僵死?等待IT界的华佗现世吧.
      

  2.   

    http://www.joycode.com/juqiang/archive/2006/12/22/89594.joy
    网上看到的也许有用
      

  3.   

    System.OutOfMemoryException
    。net程序在托管堆中申请内存的时候因为没有足够的内存而挂掉了。楼主可以在每次需要大内存的操作之前手动做GC
    还有就是楼主是否使用了很大的静态变量。有兴趣的话可以看看这个
    .NET托管内存类应用的内存泄漏分析和诊断
      

  4.   

    我认为不是内存不足的原因。
    之前我调试线程程序也出现过类似的情况,只不过我线程函数比较简单,所以恢复的快一点而已。恢复之后,VS会报异常,大概意思是说“你当前调试的线程已经退出”。我个人想法:
    你调试的线程在你长时间不执行或者的debug的时候,会异常退出,为什么退出,你需要问问ms了。线程已经退出了,但是你仍然调用线程的资源,所以就报错了,这个异常一般是会等很久时间,会造成假死状态,估计是os在处理这个错误了。
      

  5.   

    LZ用的2005?
    2005的Debugger是在多线程程序调试方面有问题的,2008已经改进了。
    2005的Debugger跨线程调试经常出问题
      

  6.   

    检查所有非托管程序的代码
    使用Debug模式编译
      

  7.   

    很有可能是内存溢出,不要详细微软的GC,改释放的时候释放,该手动调用GC的时候手动调用GC.另外注意节省资源。会不会是硬盘满了?
      

  8.   

    感觉问题都是System.OutOfMemoryException 错误所致,看有没有死循环,
      

  9.   

    我看到一个帖子说System.OutOfMemoryException 错误的
    大概的意思是不光内存不足会引起这个问题,虚拟内存一样会导致这个问题你报这个错的时候占500M的物理内存,占了多少虚拟内存呢
      

  10.   

    CPU瞬时占用为0,只能说明你的代码已经让你所有的进程挂起了,每个进程在相互等待
    还是从代码一步一步调试起,建议还是检查你所有调用的逻辑关系,每个模块调用与输出全部记录,当问题发生时去检查你的输出日志
    这样才实际点,不然大家看不到东西,很难说出个所以然来
      

  11.   

    楼上:  线程挂起,不应该妨碍VS工作,现在是VS也无法中断程序。经过一段时间改进,把系统拆分成几个独立系统,但还是问题依旧,只是不是所有拆分后的系统都有问题,只有涉及到网页访问处理的系统会不定时出现这种问题。 改进后的系统由于规模变小,目前基本没有内存不足的报错存在。而其他拆分后的系统也是多线程运行,已经持续正常运行很多天了。目前可以排除的可能有:多线程死锁,多线程控制UI(窗口输出),某个线程长期失去响应(监控线程会及时干掉它并重启),内存不足,
      

  12.   

    1. 多线程.
    2. 涉及COM调用.这两种情况下VS调试有时候会卡死, 很麻烦.考虑多用log文件.
      

  13.   

    这个问题我也有遇到类似的  但是和你的情况不一样, 本人是开发环境出现假死现象  经过我分析 是要在网络上同步发数据  由于VS环境访问的IP地址无法找到所导致的.本人在单机与联网间有做验证.可惜最终无实质性解决方法 如果谁有请知会小弟