Java JConsole中的UsageMemory Threald
我正在研究如何使用Java JConsole中的UsageMemory Threald,java,memory-leaks,heap,jconsole,Java,Memory Leaks,Heap,Jconsole,我正在研究如何使用JConsole检测内存泄漏。 我在内存池中看到,在我的MBeans中,我可以为我的终身一代定义UsageThreashold 因此,如果我的应用程序超过此阈值,则内存选项卡中的堆内存将变为红色 问题:这有什么帮助?我的意思是我应该如何使用这个设置来分析我的记忆?我该如何计算这个值呢?在我看来,UsageThreashold参数对检测内存泄漏的帮助不大(但是如果有人知道一些技巧,请分享)。根据我的经验,如果我的应用程序太接近我的最大堆大小,并且我有可能出现OutOfMemory
JConsole
检测内存泄漏。我在
内存池
中看到,在我的MBeans
中,我可以为我的终身一代定义UsageThreashold
因此,如果我的应用程序超过此阈值,则内存选项卡中的堆内存将变为红色
问题:这有什么帮助?我的意思是我应该如何使用这个设置来分析我的记忆?我该如何计算这个值呢?在我看来,UsageThreashold
参数对检测内存泄漏的帮助不大(但是如果有人知道一些技巧,请分享)。根据我的经验,如果我的应用程序太接近我的最大堆大小,并且我有可能出现OutOfMemoryException
,那么该参数对直观理解更为有用
关于使用JConsole
搜索内存泄漏,我认为这个过程没有灵丹妙药。但我通常做的是:
如果存在内存泄漏,这意味着对象(正在泄漏的对象)将不会被收集,因此,您的终身生成
在任何数量的GC之后都不会完全恢复
在应用程序运行时,我连接JConsole
,并通过观察内存选项卡尝试发现泄漏,如果在我的应用程序进行多次计算之后,以及在发生各种GC之后(包括按下Perform GC
按钮,这将导致满GC),内存从未下降,或者至少对于内存值,它开始跟踪,很可能有什么东西泄漏了。当泄漏较大时,您甚至可以在内存中看到“阶梯图”模式
请记住,如果您的应用程序运行很长时间的计算,这可能会消耗内存,则必须小心进行此分析。您必须了解这些过程何时完成。例如,只需运行其中一个计算,并跟踪内存的总体演化,在之前、期间和之后
另外,我建议您尝试一下,因为它还允许您创建堆转储,您可以使用它来了解哪些对象仍在内存中,并查看引用图以了解它们未被收集的原因。您可以使用JMAP查看直方图和/或创建堆转储,并使用Eclipse MAT或YourKit等工具研究内存消耗。
JConsole更多地用于监视和运行MBean,而较少用于分析,在我的过期版本中,JVisualvm更好,因为您可以使用它对代码进行采样,并查看哪些方法消耗CPU。但是我们可以从概述或内存选项卡中查看应用程序是否接近最大堆大小。@Cratylus:是的,这是非常正确的,但是如果jconsole在其他显示器上运行,而您没有集中注意力,那么您可以从眼角很容易发现的颜色变化是有帮助的。虽然我不能100%确定没有其他用途,但我会接受这个答案,因为没有其他用途