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