我目前调试一个多线程应用程序,它运行没有错误,直到某些函数被调用大约 2000 次。之后应用程序停止响应,我可以追踪到 _beginthreadex 因内存不足错误而失败。
在 ProcessExplorer 中检查应用程序时,我可以看到越来越多的线程句柄泄漏和不断增长的虚拟内存,直到发生错误,私有字节保持低位。泄露的线程也调用 CoInitialize 并且从不调用 CoUninitialize。
我想知道的是:
- 虚拟内存代表什么?
- 虚拟内存是否与泄漏的线程句柄有关?
- COM 或 MSXML6(由线程调用)是否复制线程句柄以及如何关闭它们?
我希望我的问题很清楚并且不会破坏任何规则,这是我的第一个问题,英语不是我的第一语言。:-(
我忘了提一下,一旦线程终止,我就会关闭 _beginthreadex 返回的句柄,这将打开的句柄数量减少了大约一半,但不会影响虚拟内存。此外,在我插入 CloseHandle 调用之前,ProcessExplorer 中显示的每个线程句柄的线程句柄计数为 2。
编辑
我以前不包括这个而变得愚蠢,我知道线程退出是因为在使用 Visual Studio 进行调试时活动线程的数量没有增加。而且我确实希望并非所有泄漏的内存都是调用 TerminateThread 的结果,因为它们在一个相当大的库中使用,我不想修改它。
对于我的问题的 com 部分,使用 !htrace -diff 我发现由 msxml 分配但在函数调用结束后未释放的线程句柄,它们可能与泄漏有关还是会在以后关闭?
感谢所有这些评论,虽然问题仍然存在,但他们帮助我更好地理解它。