最近解决了一个内存泄漏的问题,问题的起因是在测试过程中施加了极大的压力,以至于CPU的利用率一直维持在100%。此时出现了大量的内存泄漏。
当时从代码中没有找到原因,后来通过其他方面的努力,找到原因如下:当时使用的机制是Windows Post Message。在某个线程中new一块Buffer,通过PostMessage传递到另外一个线程中delete.在100%CPU的状态下,这部分事件没有足够的时间片处理,导致事件堆积越来越多,以至于windows丢弃事件,从来buffer没有delete,最终内存泄漏。
Window中event queue的长度设置如下:
Windows 2000: There is a limit of 10,000 posted messages per message queue. This limit should be sufficiently large. If your application exceeds the limit, it should be redesigned to avoid consuming so many system resources. To adjust this limit, modify the following registry key:
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/WindowsNT/CurrentVersion/Windows/USERPostMessageLimit.
The minimum acceptable value is 4000.
虽然可以通过这个办法增加queue的长度缓解问题,但是没有办法最终解决问题。所以这种做法是不合理的。