Java句柄(互斥??)泄漏但未释放(不是文件句柄)

时间:2012-12-25 12:42:09

标签: java mutex memory-leaks handles

我有一个运行很长时间的复杂Java应用程序。应用程序执行相同的操作,几乎没有细微差别,一遍又一遍。 我的问题是Windows任务管理器显示了很多java进程的泄漏句柄(不是文件句柄)。

在压力下运行应用程序一段时间后,我遇到了奇怪的故障,例如应用程序卡住,消失,或者在尝试打开文件时遇到FileNotFoundException(“系统资源不足以完成所请求的服务”)。

我使用Windows任务管理器来查看问题所在,并发现对于java.exe进程 - 句柄数量正在快速增加。线程数没有增加,RAM的使用量也没有增加。

然后我使用了SysInternal的Process Explorer来了解这些句柄是什么。我看到它们不是文件句柄,而是数千个'Mutant'类型的句柄,名称为\ BaseNamedObjects \ ?????? n。 根据网络上的一些网站,Mutant in Process explorer意味着Mutex。 我的Java应用程序不会故意创建任何互斥锁。

下一步是使用分析工具来缩小泄漏源。 我使用了“J Optimizer”& “Java VirtualVM”。对于这两个应用程序,我无法检测泄漏的句柄。他们有内存泄漏检测器,但我找不到检测泄漏手柄的方法。

我的问题是: 我该如何调试这个问题?我怎样才能发现泄漏手柄的原因?

谢谢

1 个答案:

答案 0 :(得分:0)

如果您对如何分配泄漏的参考文件感到好奇,请参阅:How to view memory allocation stacktrace in Java VisualVM

我不确定你是如何追踪引用无法解除分配的。