4

我正在调查我们的一个生产系统上的 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.

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

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

4

2 回答 2

5

我从未找到准确描述“紧致烫发”值的参考资料,但我们自己的调查证明,报告的值是:

当前使用的 PermGen / 当前分配的 PermGen

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

对于那些遇到类似问题的人 - 我们最终解决了我们的问题。在我们的例子中,它原来是一个第三方库,它使用了sun.misc.Unsafe类,当使用不正确时,它是出了名的“不安全” 。

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

于 2013-06-03T09:41:04.393 回答
0

But just because you set MaxPermSize to 1GB doesn't mean HotSpot will honor it. I don't think I've ever gotten more than 512MB. Your JVM's 482MB is pretty close to this figure.

In any case, 512MB is plenty for PermGen since it's only used to hold classes' metadata, it won't grow in size unless more classes are loaded through ClassLoader. So the question is: do you really need more than 512MB to hold roughly the size of the bytecodes of all the necessary classes in memory?

It's very possible that your system actually has memory leaks in PermGen.

于 2013-06-03T06:45:41.083 回答