程序不释放句柄

时间:2015-10-23 15:31:50

标签: c# handle memory-profiling

我有一个C#程序正在做一些繁重的工作。它创造了许多物体并用它们运行遗传算法。

现在我遇到的问题是程序在完整剪辑运行时(即没有连接的调试器或分析器)正在创建~300个句柄/秒。更重要的是,它似乎没有释放任何一个。大约15/16小时后,没有更多的手柄可用,程序就死了。

我在调试时遇到的问题是我的内存管理似乎非常好,基于我的探查器(JustTrace)。这些对象似乎得到了清理(虽然在运行了几个小时之后有很多Gen2对象存在),并且该程序似乎最多只占用35MB内存。它仍然坚持它的句柄!

如果我关闭程序,所有句柄都会被释放。

我应该在哪儿看?是否存在可以保留多余句柄但与内存中的对象无关的东西?

编辑:注意,当我说" Handles"时,我的意思是我在Windows中打开任务管理器并查看" Handles"在"系统" “效果”标签上的框。

Edit2:所以迟了几周,我发现它是我的防病毒工具,防止线程句柄被释放。奇怪的是,我们使用的防病毒软件根据我所读过的内容不应该进行这种过程扫描。更重要的是,我没有能力将我的进程从AV扫描中排除!

我有什么办法让AV有机会释放线程吗?我试过添加一些额外的睡眠,但似乎并没有起作用。 AV是BitDefender Endpoint Security 2015。

2 个答案:

答案 0 :(得分:0)

我通常也使用JustTrace,但最近我遇到了一个类似的问题,即分析器没有告诉我整个故事。

redgate ANTS分析器还可以显示非托管内存,这是我的问题。查看非托管内存可能会为您提供有关正在发生的事情的线索。

答案 1 :(得分:0)

事实证明我的防病毒软件阻止了线程句柄被释放。除了禁用/切换防病毒之外,我还没有找到防止这种情况发生的方法。如果我找到更好的方法,我会在这里更新。