2016-05-14 54 views
4

我有一个JEE应用程序,最近开始发现CPU使用率高峰(例如,40核心服务器上的27个内核的100%)和越来越长的时间段该应用程序不可用。这是非常类似的行为在下面的帖子中描述的问题,以包括回弹应用程序的服务器,使问题消失,直到它再次出现在几个小时后的事实:JVM YoungGen 0%,Perm Gen 99%,OldGen Full

Old Gen heap is full and the Eden and Survivor are low and almost empty

我已经采取了一些核心转储输出,而应用程序正在经历这些“冻结”,我看到下面的JVM GC输出:基于引用柱和上面的输出

PSYoungGen total 11221504K, used 2435K 
eden space 9238528K, 0% used 
from space 19829796K, 0% used 
to space 1970176K, 0% used 
ParOldGen total 39613440K, used 39276477K 
object space 39613440K, 99% used 
PSPermGen total 254976K, used 115497K 
object space 254976K, 45% used 

,我想我明白了“冻结”正在由垃圾收集器在ParOldGen空间上运行(徒劳?)驱动。我缺少的部分:

  1. 为什么PermGen空间保持在45%的使用率。也就是说,ParOldGen中约39GB的内容最终会转变为PSPermGen吗?

  2. 几乎空PSYoungGen空间的意义是什么?这是否意味着应用程序不会在稳定状态下创建任何/许多新的对象实例?

支柱上方还介绍了“多予净空”来ParOldGen的选项,但我不清楚是否意味着增加通过-Xmx总堆大小或者是否有一个明确的JVM GC参数。我看到NewRatio论点控制了年轻一代相对于老一代的规模。 PSYoungGen实质上是空的这一事实意味着它太大了,我应该使用更小的NewRatio值?

在此先感谢您的帮助。

+0

从老根的东西没有得到晋升为permgn空间,你可能有一个在permgen某处泄漏,你的应用程序是否动态地创建了很多类? –

+0

谢谢你的评论。我现在明白,permgen空间不是堆的一部分(每个http://stackoverflow.com/questions/2129044/java-heap-terminology-young-old-and-permanent-generations )。该应用程序确实创建了很多动态类。看起来我们要么有内存泄漏,要么应用程序的内存要求超过当前的-Xmx值。 –

+0

您可以动态创建大量的类或对象吗?如果类然后你的permgen会充满,如果对象然后oldgen。 –

回答

1

ParOldGen中的〜39GB的东西最终会转变成PSPermGen吗?

Java 7中的PermGen(替换为Java 8中的元空间)用于保存代码。从堆传递给PermGen的唯一的东西是字节码,所以除非你正在生成或加载类,否则没有任何东西从一个传递到另一个。他们是不同的空间。

几乎空PSYoungGen空间的意义是什么?

完整的GC后,年轻的gen是空的。一旦你的老电池开始充满,完整的GC就很常见了。

这是否意味着应用程序未在稳定状态下创建任何/许多新对象实例?

它最有可能意味着它最近已经完成了GC-ed。

描述了给ParOldGen“给予更多空间”的选项,但是我不清楚这是否意味着通过-Xmx增加总堆大小,或者是否有明确的JVM GC参数。

增加最大堆可以给你更多的头部空间,但我会首先检查

  • 你没有内存泄漏。
  • 您不能将大部分数据从堆中移出,例如一个数据库或本机内存。

将在事实PSYoungGen基本上是空意味着它是太大,而且我应该使用一个较小的NewRatio值?

这可能有助于为老一代提供更多的空间,但它可能会在耗尽内存之前给您多一点时间。

0

为什么PermGen空间保持在45%的使用率。也就是说,ParOldGen中约39GB的内容最终会转变为PSPermGen吗?

编号OldGen & PermGenPermGen空格不能共享。 PSPermGen大多包含由PermGen空间中的类加载器加载的类。 ParOldGen包含长寿命对象的堆内存。

在JDK 1.8中,PermGen已经由Metaspace取代。有关更多详细信息,请参阅此article

请参阅以下SE问题,了解更多详情:

Java heap terminology: young, old and permanent generations?

什么是几乎空的PSYoungGen空间的意义是什么?这是否意味着应用程序不会在稳定状态下创建任何/许多新的对象实例?

@Peter Lawrey已经正确回答了。全GC后,YoungGen几乎是空的=>你没有积累从短暂的对象垃圾在你的应用

上面还张贴内容介绍了“多予净空”来ParOldGen的选项,但我'不清楚这是否意味着通过-Xmx增加总堆大小,或者是否有明确的JVM GC参数。

您的旧gen已满意味着您的应用程序正在保留堆中的长寿命对象。

现在,你必须使用分析工具像visualvmMAT

检查可能的内存泄漏(如果有的话)在您的应用程序。如果你没有内存泄漏,你可以用-Xmx增加堆大小。

PSYoungGen实质上是空的事实意味着它太大了,我应该使用较小的NewRatio值?

由于您使用的是较大的堆,我建议您使用G1GC算法。如果您使用G1GC算法,请不要自定义默认值,因为G1GC算法会处理更好的堆管理。

看一看上G1GC开关(Complete List of G1 GC Switches部分),Use Cases文章预言文章及相关SE问题:

Java 7 (JDK 7) garbage collection and documentation on G1