1

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

我正在运行相同的负载,当时我通过 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 "

在此处输入图像描述

在此处输入图像描述

4

2 回答 2

0

你需要知道它在那个时期做了什么。您的负载可能没有改变,但您可能会发现通常使用少量内存的任务碰巧很少使用大量内存。我会在您的应用程序上使用内存分析器来查看内存的使用方式以及导致它的代码。

于 2012-09-07T09:41:08.747 回答
0

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

关于你的 GC 设置,我会去掉“-XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled”,因为它们通常会导致很长的暂停时间,而这并不是真正需要的。“-XX:+UseAdaptiveGCBoundary”也提出了一个问题,即您使用此参数的动机是什么。我个人不会。

于 2012-11-25T21:37:35.973 回答