这是对我以前的问题的后续问题。
正如我在上一个问题的答案中所build议的那样 ,我使用了ProcessExplorer来分析我的应用程序用于查找句柄泄漏的句柄列表。
泄漏的句柄是Sectiontypes的。
什么是一个部分句柄,它在哪里使用,并可能导致部分句柄泄漏?
我没有在我的代码中使用内存映射文件。
引用Mark Russinovich的Inside Windows 2000(现在叫做Windows Internals),
Win32子系统调用文件映射对象的section对象代表两个或多个进程可以共享的内存块。
所以,这是一个内存映射文件。 如果您创建了内存映射文件,并且未能关闭它,它们会泄漏。 很难得到更具体的。
事实证明,问题是在一个低级函数中,它计算当前进程的线程数量。 这个函数使用了
CreateToolhelp32Snapshot
返回句柄的API函数,该句柄没有正确关闭。 我不知道为什么这会产生一个节处理泄漏。
IPC(进程之间的通信)可以使用与文件句柄无关的内存映射文件。 如果你不直接使用它们,也许你的一个单元或组件正在进行IPC通信。 您很可能使用组件连接到另一个进程,并且不要按要求释放它。
首先要采取的行动是跟踪任何内存泄漏 (使用FastMM4调试模式),你一定会发现你的代码中有一些未发布的对象。
由于句柄通常由对象分配,所以在我的实验中,解决所有的内存泄漏将解决句柄泄漏问题。
如果您没有任何内存泄漏,则会有一些CreateFileMapping()
调用在您的所有源代码(包括第三方源代码CloseHandle()
中检查相应的CloseHandle()
)。
.net中的部分句柄泄漏是由于Microsoft修补程序KB2670838。 卸载此更新和部分处理泄漏问题(内存不足)将被修复。
Parameter is not valid. at System.Drawing.Image.get_Width() at System.Drawing.Image.get_Size()