我有一个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空间上运行(徒劳?)驱动。我缺少的部分:
为什么PermGen空间保持在45%的使用率。也就是说,ParOldGen中约39GB的内容最终会转变为PSPermGen吗?
几乎空PSYoungGen空间的意义是什么?这是否意味着应用程序不会在稳定状态下创建任何/许多新的对象实例?
支柱上方还介绍了“多予净空”来ParOldGen的选项,但我不清楚是否意味着增加通过-Xmx总堆大小或者是否有一个明确的JVM GC参数。我看到NewRatio
论点控制了年轻一代相对于老一代的规模。 PSYoungGen实质上是空的这一事实意味着它太大了,我应该使用更小的NewRatio
值?
在此先感谢您的帮助。
从老根的东西没有得到晋升为permgn空间,你可能有一个在permgen某处泄漏,你的应用程序是否动态地创建了很多类? –
谢谢你的评论。我现在明白,permgen空间不是堆的一部分(每个http://stackoverflow.com/questions/2129044/java-heap-terminology-young-old-and-permanent-generations )。该应用程序确实创建了很多动态类。看起来我们要么有内存泄漏,要么应用程序的内存要求超过当前的-Xmx值。 –
您可以动态创建大量的类或对象吗?如果类然后你的permgen会充满,如果对象然后oldgen。 –