“压缩烫发”值代表什么?

时间:2013-03-25 09:25:32

标签: java jvm crash-reports crash-dumps jvm-crash

我正在调查我们的某个生产系统上的JVM崩溃,下面的hs_err_pid日志文件片段中的以下内存值代表什么?

Heap
 par new generation   total 1258624K, used 955445K [0x00000005c0000000, 0x00000006155b0000, 0x000000066aaa0000)
  eden space 1118784K,  73% used [0x00000005c0000000, 0x00000005f1e52598, 0x0000000604490000)
  from space 139840K,  98% used [0x000000060cd20000, 0x00000006153db100, 0x00000006155b0000)
  to   space 139840K,   0% used [0x0000000604490000, 0x0000000604490000, 0x000000060cd20000)
 tenured generation   total 2796224K, used 1745107K [0x000000066aaa0000, 0x0000000715550000, 0x00000007c0000000)
   the space 2796224K,  62% used [0x000000066aaa0000, 0x00000006d52d4d90, 0x00000006c2e0c400, 0x0000000715550000)
 compacting perm gen  total 482944K, used 482943K [0x00000007c0000000, 0x00000007dd7a0000, 0x0000000800000000)
   the space 482944K,  99% used [0x00000007c0000000, 0x00000007dd79fff0, 0x00000007dd7a0000, 0x00000007dd7a0000)
No shared spaces configured.

我关心的是“压缩的perm gen”用法:它是指最大分配的perm gen堆使用的百分比,还是最大堆使用的百分比,还是其他什么?提供的百分比似乎是使用/总计的一个除法,这是分配的perm gen总数吗?由于我们的-XX:MaxPermSize设置为1GB ...

是否有任何有用的资源(Oracle whitepaper除外,它没有提及hs_err文件)来解释在JVM崩溃时转储的数据?

2 个答案:

答案 0 :(得分:5)

我从未找到准确描述“压缩烫发”值的参考文献,但我们自己的调查证明报告的值是:

  

目前使用的是PermGen /目前已分配的PermGen

在我的问题的例子中,这意味着已经为PermGen分配了482944K的内存,并且在GC点使用了482943K(99%)。我们的最大PermGen大小设置为1048576K(1GB),因此收集过程有大量的预留资源可以重新分配。

对于那些遇到类似问题的人 - 我们最终解决了我们的问题。在我们的案例中,它被证明是使用sun.misc.Unsafe类的第三方库,如果使用不正确,则为notoriously "unsafe"

在这种情况下,piece of logic for cloning objects将特定的ClassLoader传递给某些sun.misc.Unsafe操作以复制对象。在某些计算机上,复制的对象经常在损坏的状态下创建。当JVM试图进行垃圾收集时,它最终会收获其中一个坏对象并崩溃。这总是导致我的问题中描述的错误。

答案 1 :(得分:0)

但仅仅因为你将MaxPermSize设置为1GB并不意味着HotSpot会尊重它。我认为我没有超过512MB。你的JVM的482MB非常接近这个数字。

在任何情况下,PermGen都有512MB,因为它只用于保存类的元数据,除非通过ClassLoader加载更多的类,否则它的大小不会增加。所以问题是:你真的需要超过512MB来保持内存中所有必要类的字节码的大小吗?

您的系统很可能实际上有memory leaks in PermGen