代码改变世界

除了memory leak和handle leak外的其它资源泄露

2006-11-05 11:13  lixiong  阅读(3037)  评论(0编辑  收藏  举报

 

除了memory leakhandle外,其它类型的资源泄露还有GDI Leakdesktop 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除了使用进程来管理资源外,还是用Sessiondesktop来管理资源。比如只有在同一个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

 

如果排错只是按部就班的操作,排错就不是一项有趣的工作了。