0

我正在研究如何使用JConsole来检测内存泄漏。
我看到Memory Pool在我的MBeans我可以UsageThreashold为我的Tenured Generation.
因此,如果我的应用程序超过此阈值,则堆内存在“内存”选项卡中变为红色。

问题:这有什么帮助?我的意思是我应该如何使用这个设置来分析我的记忆?我应该如何计算这个值?

4

2 回答 2

0

您可以使用 JMAP 查看直方图和/或创建堆转储并使用 Eclipse MAT 或 YourKit 等工具研究您的内存消耗。JConsole 更多地用于监视和运行 MBean,而更少用于分析,在我的过期时间里,JVisualvm 对此更好,因为您可以使用它来对代码进行采样并查看哪些方法消耗 CPU。

于 2014-03-27T20:55:37.717 回答
0

在我看来,我不认为该UsageThreashold参数对您检测内存泄漏最有帮助(但如果有人知道它的一些技巧,请分享)。根据我的经验,如果我的应用程序太接近我的最大堆大小并且我有可能获得OutOfMemoryException.

仍然关于使用JConsole搜索内存泄漏,我认为这个过程没有灵丹妙药。但我通常做的是以下几点:

如果存在内存泄漏,则意味着对象(正在泄漏的对象)不会被收集,因此,Tenured Generation在任何数量的 GC 之后,您都不会完全恢复。

随着应用程序的运行,我连接JConsole并尝试通过观察内存选项卡来发现泄漏,如果在我的应用程序的多次计算以及发生各种 GC 之后(包括按下Perform GC按钮,这将导致完整的 gc)内存永远不会低于,或者至少到内存值,它开始跟踪很有可能发生了泄漏。当泄漏很大时,您甚至可以在内存中看到“阶梯图”模式。

请记住,如果您的应用程序运行的计算时间很长,这可能会消耗内存,则必须仔细进行此分析。您必须了解这些过程何时完成。例如,只需运行其中一项计算并跟踪内存在之前、期间和之后的总体演变。

另外,我建议您尝试使用 visualVM,因为它还允许您创建堆转储,您可以使用它来了解哪些对象仍在内存中并探索引用图以了解为什么它们没有被收集。

于 2012-12-01T15:18:31.370 回答