我在 CentOS 64 位 Linux 机器上使用 jdk 1.7.0_09。
与 gc 相关的 vm 参数是
-Xmx4g -Xmn2g -XX:SurvivorRatio=4 -XX:PermSize=128m -XX:MaxPermSize=128m -XX:InitialTenuringThreshold=15 -XX:CMSWaitDuration=50 -XX:MaxTenuringThreshold=15 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:CMSInitiatingOccupancyFraction=80 -XX:+CMSParallelRemarkEnabled -XX:ReservedCodeCacheSize=128m
但是它一直在进行full gc
jstat -gcutil pid 1000
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 0.00 15.62 57.52 19.90 11 2.081 11109 7454.686 7456.767
0.00 0.00 15.81 57.52 19.90 11 2.081 11109 7454.686 7456.767
0.00 0.00 15.81 57.51 19.90 11 2.081 11111 7454.892 7456.973
0.00 0.00 16.06 57.51 19.90 11 2.081 11111 7455.115 7457.196
0.00 0.00 16.06 57.51 19.90 11 2.081 11111 7455.115 7457.196
0.00 0.00 16.27 57.51 19.90 11 2.081 11111 7455.115 7457.196
0.00 0.00 16.27 57.51 19.90 11 2.081 11111 7455.115 7457.196
0.00 0.00 16.29 57.51 19.90 11 2.081 11111 7455.115 7457.196
0.00 0.00 16.29 57.51 19.90 11 2.081 11111 7455.115 7457.196
0.00 0.00 16.29 57.47 19.90 11 2.081 11113 7455.549 7457.629
0.00 0.00 16.29 57.47 19.90 11 2.081 11113 7455.549 7457.629
0.00 0.00 16.34 57.47 19.90 11 2.081 11113 7455.549 7457.629
0.00 0.00 16.34 57.47 19.90 11 2.081 11113 7455.549 7457.629
0.00 0.00 16.34 57.47 19.90 11 2.081 11113 7455.549 7457.629
0.00 0.00 16.42 57.47 19.90 11 2.081 11114 7455.549 7457.629
0.00 0.00 16.42 57.44 19.90 11 2.081 11115 7455.986 7458.067
最佳答案
尽管有“FGC”列,但它并不是真正的完整 GC。 CMS 正在做的是并发收集,以查看是否可以从旧收集中清除任何内容(您可以看到它正在执行此操作)。判断这不是完整 GC 的方法是,完整 GC 会清除 eden 空间并从一个幸存者空间复制到另一个空间。
恕我直言,您使用的选项越多,您就越有可能遇到一些具有令人惊讶结果的组合。我会坚持最少的选择,看看效果如何。仅当您知道它们总是有帮助时才添加选项。
尝试从以下开始
-mx4g -XX:MaxPermSize=128m -XX:+UseConcMarkSweepGC
关于java - 为什么 JVM 不断进行 full gc,而老一代只有半满?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13561568/