正如this answer to my previous question中所建议的那样,我使用 ProcessExplorer 来分析我的应用程序用来查找句柄泄漏的句柄列表。
泄漏的句柄类型为 Section 。
部分句柄究竟是什么,它在哪里使用以及哪些部分句柄会泄漏?
我在代码中没有使用内存映射文件。
答案 0 :(得分:4)
引用Mark Russinovich的Inside Windows 2000(现在称为Windows Internals),
Win32子系统调用文件映射对象的节对象表示两个或多个进程可以共享的内存块。
所以,它是一个内存映射文件。如果您创建了内存映射文件并且无法关闭它们,它们就会泄漏。很难更具体。
答案 1 :(得分:3)
事实证明,问题出在一个低级函数中,它计算当前进程的线程数。这个函数使用了
CreateToolhelp32Snapshot
API函数,它返回一个未正确关闭的句柄。我不知道为什么会产生一个部分句柄泄漏。
答案 2 :(得分:2)
与文件句柄无关的内存映射文件可用于IPC(进程间通信)。如果您不直接使用它们,可能您的某个单元或组件正在进行一些IPC通信。您很可能使用组件连接到另一个进程,并且不按请求释放它。
要采取的首要措施是跟踪任何内存泄漏(使用FastMM4调试模式),您肯定会在代码中找到一些未发布的对象。
由于句柄通常由对象分配,因此从我的实验中,解决所有内存泄漏将解决句柄泄漏问题。
如果您没有任何内存泄漏,可以通过一些CreateFileMapping()
来检查所有源代码(包括第三方来源)中的相应CloseHandle()
。
答案 3 :(得分:1)
.net中的部分句柄泄漏是由Microsoft Hotfix KB2670838引起的。 卸载此更新,将修复部分句柄泄漏问题(Out of Memory)。
Parameter is not valid. at System.Drawing.Image.get_Width()
at System.Drawing.Image.get_Size()