Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JConsole中的UsageMemory Threald_Java_Memory Leaks_Heap_Jconsole - Fatal编程技术网

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%确定没有其他用途,但我会接受这个答案,因为没有其他用途