抓虫记之九:都是线程惹的祸

 

在发生的时候,没有抛出异常现象,这样的BUG是很难进行跟踪的。你只有通过各种方向的分析,调查,才能慢慢的找到。

这就好像,突然发现一个尸体,你就得到失踪人口里去寻找,可是是否找得到,有时候可能就是运气问题。

幸好,软件不是现实,我们可以反复的进行调试。

同样是上次案例的那个服务器。有一段时间发现服务器在自动化测试的时候,每跑到2个小时后,就会出现内存不足的问题。这肯定是出现内存泄露了。

我们有跟踪TObject创建和释放的钩子,但却发现没有对象忘记释放的情况。

而且在本地调试,怎么也出现不了这个情况。但一放到自动化测试环境中,就准会崩溃。

实在没辙,只能跟踪服务器内存占用情况,发现挺奇怪的,每次都是5M的速度增长。

突然,我们的开发人员Supper,灵机一动,他想到ExceptLog就是会在异常的时候,申请5M,是不是是他。

看了一下代码,这里确实是申请了5M,但是有释放的代码啊。怎么回事呢?

突然又想,会不会是服务器的多线程导致的?

看了一下,记录申请空间的变量,竟然是一个全局变量(不是线程局部对象),那么在多线程的时候,比如会出现,两个对象同时创建,但在没有释放之前,其中一个已经把另外一个覆盖掉了。

类似于下面的代码:

oErrMemory := VirtualAllocMemory( … )

在高并发,长期运行的情况下,服务器迟早会内存不足的。

后来修改了加上了互斥量,就没这个问题了。我们往往经验都在写单线程系统,确实缺少写多线程的经验。最好的办法,其实就是不要使用外部变量,只用函数自己的变量是最安全的。

posted on 2011-08-02 18:55  ohmyjava  阅读(129)  评论(0编辑  收藏  举报

导航