"压缩烫发"值代表什么?

sea*_*ges 4 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.
Run Code Online (Sandbox Code Playgroud)

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

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

sea*_*ges 5

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

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

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

对于那些遇到类似问题的人 - 我们最终解决了我们的问题.在我们的案例中,它原来是一个使用sun.misc.Unsafe类的第三方库,如果使用不当,这是众所周知的"不安全".

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