除了memory leak和handle leak外的其它资源泄露
2006-11-05 11:13 lixiong 阅读(3049) 评论(0) 编辑 收藏 举报除了memory leak和handle外,其它类型的资源泄露还有GDI Leak和desktop heap high usage。
关于GDI Leak,可以参考:
Detect and Plug GDI Leaks in Your Code with Two Powerful Tools for Windows XP
http://msdn.microsoft.com/msdnmag/issues/03/01/GDILeaks/default.aspx
Resource Leaks: Detecting, Locating, and Repairing Your Leaky GDI Code
http://msdn.microsoft.com/msdnmag/issues/01/03/leaks/default.aspx
Desktop heap是一类特殊的内存。下面这些kb对此有一些描述:
PRB: User32.dll or Kernel32.dll fails to initialize
http://support.microsoft.com/kb/184802/en-us
"Out of Memory" error message appears when you have a large number of programs running
http://support.microsoft.com/kb/126962/en-us
到support.microsoft.com 上搜索desktop heap,可以找到更多的信息。Windows除了使用进程来管理资源外,还是用Session和desktop来管理资源。比如只有在同一个Session里面的进程才可以共享剪贴板数据,Windows Message只能在属于同一个desktop的进程之间传递。而desktop heap,是操作系统管理的,为不同session创建的,由同一session内所有desktop共享的内存。当创建进程,创建GUI的时候,都会消耗desktop heap。当Desktop Heap用光后,系统中各种莫名其妙的问题就会发生。比如无法创建新进程,无法弹出菜单,API调用会莫名其妙地出错。
Desktop heap用光的原因往往是太多进程同时运行,或者创建了太多GUI object。怀疑是Desktop heap相关问题的时候,首先可以用下面这篇文章的方法来检查是否Desktop heap用光:
A new System log entry is not generated if the desktop heap is exhausted in Microsoft Windows 2000
http://support.microsoft.com/kb/810807/en-us
如果确认是desktop heap问题后,检察系统是否有太多进程在同时运行,(我曾经见过一百多个dllhost进程同时运行的情况),或者某一程序有特殊的GUI操作。在优化系统,优化代码后,如果的确需要使用很多desktop heap,可以参考前面的kb改变注册表来做调整。
除了上面这些系统资源外,还有其它很多资源都可能出现问题,比如TCP Port用光。
When you try to connect from TCP ports greater than 5000 you receive the error 'WSAENOBUFS (10055)'
http://support.microsoft.com/kb/196271/en-us
如果排错只是按部就班的操作,排错就不是一项有趣的工作了。