4

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

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

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

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

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

我的问题是:如何调试这个问题?如何发现导致手柄泄漏的原因?

谢谢

4

1 回答 1

0

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

我不确定您如何跟踪引用如何未能解除分配。

于 2012-12-25T14:25:21.960 回答