java - 为什么 JVM 不断进行 full gc,而老一代只有半满?

标签 java garbage-collection jvm-hotspot concurrent-mark-sweep

我在 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/

相关文章:

java - 如何使用 Spring-data-Redis 实现 Redis Multi-Exec

c# - 如何从另一个集合中生成游戏实体集合而不产生垃圾?

java - 避免需要设置 jmxremote 端口(以远程使用 VisualVM)?

java - OSR 编译的方法可以被后续调用使用吗?

java - 检索 Multimap 中的特定值

Java 日期格式问题

java - 为什么我运行应用程序时按钮不起作用?

java - 在循环中添加到集合中的对象何时会被垃圾收集?

c# - 垃圾邮件 GC.KeepAlive(KeyboardHookPointer) 有什么问题吗?

java - Jvm native 代码编译疯狂 - 即使在编译代码后,我似乎也会在一段时间内遭受奇怪的性能损失。为什么?