繁体   English   中英

为什么JVM做这么多垃圾collections

[英]Why is the JVM doing so many garbage collections

下面是来自 JVM 的jstat output,使用以下参数运行

-Xmx10240m -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode 

jstat output 是带参数的

jstat -gcutil <pid> 10s

该部分是一段 80 秒的片段,据统计,其中近 70 秒用于 GC。 它们都是正在触发的完整 GC。

Timestamp   S0  S1  E       O       P       YGC     YGCT        FGC     FGCT        GCT         Diff
1040430.2   0   0   23.69   24.58   95.03   168048  22187.057   3672    4483.931    26670.988   8.175
1040440.2   0   0   0.1     24.58   95.02   168048  22187.057   3674    4495.551    26682.608   11.62
1040450.2   0   0   4.19    24.59   95.03   168048  22187.057   3677    4506.731    26693.788   11.18
1040460.2   0   0   0.01    24.45   95.02   168048  22187.057   3679    4517.391    26704.448   10.66
1040470.2   0   0   0.33    24.45   95.03   168048  22187.057   3681    4522.213    26709.27    4.822
1040480.2   0   0   0       24.43   95.02   168048  22187.057   3684    4534.816    26721.874   12.604

PermGen 空间几乎已满,但我不认为 Sun GC 机制会尝试在这里收集,我可以看到基于 Eden 或 Old 空间收集的原因。

任何能够给我一些指示的人都可能会发生什么?

为什么JVM做那么多垃圾collections。

这很可能是因为永久代占用率非常高。 使用 CMS 算法时,仅当老代或永久代占用率超过定义的阈值时,才会启动主要收集。 除非我弄错了,否则老年代的默认占用阈值为 68%,这可以使用-XX:CMSInitiatingOccupancyFraction=n标志进行更改。 然而,就所提供的数据而言,这个值似乎并不重要,因为在进行统计时,老一代的占用率似乎低于 25%(这并不意味着老一代在此期间没有被填满) ,但当永久代本身表现出更高的占用率时,这是不可能的)。

请注意,默认情况下,CMS 收集器不会从永久代中声明对象。 这需要打开CMSClassUnloading标志。 如果行为没有改善,那么很可能永久代的大小不正确,并且必须给它更多的 memory,因为很明显永久代中只有少数对象有资格在每个主要的收集周期。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM