Java:内存利用率问题(观察到突然峰值)

时间:2012-09-07 09:37:34

标签: java java-ee memory memory-management memory-leaks

我正在观察我的应用程序/服务的内存利用率。

我正在运行相同的负载,当时我已经通过Jconsole看到内存介于1.5到1.7 GB之间(可以在图像上看到)。突然间我注意到内存高达几秒钟,但在这里我想提一下,在用例(相同负载)方面没有任何改变。

我需要知道为什么内存突然升高的原因。在我的设置中没有任何改变,导致内存的原因变高。

GC参数中是否有任何错误?

请求你的想法。

我使用的GC参数是:

  

export GC1_OPTS =“ - XX:+ UseConcMarkSweepGC -XX:+ UseParNewGC   -XX:CMSInitiatingOccupancyFraction = 50 -XX:+ CMSPermGenSweepingEnabled -XX:+ CMSClassUnloadingEnabled -XX:+ CMSParallelRemarkEnabled -XX:+ UseAdaptiveGCBoundary“export GC2_OPTS =” - XX:+ ExplicitGCInvokesConcurrent“

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:0)

您需要知道在此期间它正在做什么。您的负载可能没有改变,但您可能会发现通常使用少量内存的任务很少使用大量内存。我会在你的应用程序中使用内存分析器来查看内存的使用情况以及导致它的代码。

答案 1 :(得分:0)

你错过了问题的一个重要部分:“问题是什么” 你看到使用的内存增加了。这可能是您的应用程序代码中以某种方式触发的错误,但从垃圾收集的角度来看,这不是问题。 如果你可以生成这个,我会做两个堆转储,一个在1.7 GB,然后一个在2.5 GB堆。 您可以使用Eclipse MAT和delta模式来比较转储。您将看到您拥有的额外物品。然后你就可以知道它是不是一个问题。

关于你的GC设置,我会摆脱“-XX:+ CMSPermGenSweepingEnabled -XX:+ CMSClassUnloadingEnabled”,因为它们通常会导致很长的暂停时间,这些都不是真正需要的。此外,“-XX:+ UseAdaptiveGCBoundary”提出了使用此参数的动机是什么。我个人不会。