3

我们正在经历次要 GC 暂停时间的增加。该应用程序是一个用 Java 编写的服务器,每秒执行 500 个事务。CMS 收集后,暂停时间会减少,但运行数小时后,暂停时间会再次增加。我用vmstat检查了交换使用情况,没有任何交换输入/输出。

次要 gc 暂停时间增加的可能原因是什么?

这是 gc 日志文件的一部分,而次要 gc 暂停时间很短:(0.01 秒)

{GC 调用前的堆=123(满 0):
 par 新一代总计 306688K,使用 275101K [0xffffffffe80010000, 0xffffffffe94cd0000, 0xffffffffe94cd0000)
  伊甸园空间 272640K, 100% 已使用 [0xffffffffe80010000, 0xffffffffe90a50000, 0xffffffffe90a50000)
  从空间 34048K,使用 7% [0xffffffffe92b90000, 0xffffffffe92df7718, 0xffffffffe94cd0000)
  到空间 34048K, 0% 使用 [0xffffffffe90a50000, 0xffffffffe90a50000, 0xffffffffe92b90000)
 并发标记扫描生成总数 3243264K,使用 71097K [0xffffffffe94cd0000, 0xffffffff5ac10000, 0xffffffff5ac10000)
 concurrent-mark-sweep perm gen 总计 262144K,已使用 30336K [0xffffffff5ac10000, 0xffffffff6ac10000, 0xffffffff6ac10000)
2012-07-29T20:00:19.790+0300:472.781:[GC 472.782:[ParNew
所需的幸存者大小 17432576 字节,新阈值 4(最大 4)
- 年龄 1:1068432 字节,总共 1068432
- 年龄 2:296272 字节,总共 1364704
- 年龄 3:68624 字节,总共 1433328
- 年龄 4:53776 字节,总共 1487104
: 275101K->2187K(306688K), 0.0111305 secs] 346199K->73301K(3549952K), 0.0127033 secs] [Times: user=0.13 sys=0.01, real=0.01 secs]
GC 调用后的堆=124(满 0):
 par 新一代总 306688K,使用 2187K [0xffffffffe80010000, 0xffffffffe94cd0000, 0xffffffffe94cd0000)
  伊甸园空间 272640K, 0% 已使用 [0xffffffffe80010000, 0xffffffffe80010000, 0xffffffffe90a50000)
  从空间 34048K,使用 6% [0xffffffffe90a50000, 0xffffffffe90c72dc0, 0xffffffffe92b90000)
  到空间 34048K,使用 0% [0xffffffffe92b90000, 0xffffffffe92b90000, 0xffffffffe94cd0000)
 并发标记扫描生成总数 3243264K,使用 71114K [0xffffffffe94cd0000, 0xffffffff5ac10000, 0xffffffff5ac10000)
 concurrent-mark-sweep perm gen 总计 262144K,已使用 30336K [0xffffffff5ac10000, 0xffffffff6ac10000, 0xffffffff6ac10000)
}

以下是 gc 日志文件的一部分,而次要 gc 暂停时间很长:(0.9 秒)

{GC 调用前的堆=38526(全 3):
 par 新一代总计 306688K,已使用 280310K [0xffffffffe80010000, 0xffffffffe94cd0000, 0xffffffffe94cd0000)
  伊甸园空间 272640K, 100% 已使用 [0xffffffffe80010000, 0xffffffffe90a50000, 0xffffffffe90a50000)
  从空间 34048K, 22% 使用 [0xffffffffe90a50000, 0xffffffffe911cda60, 0xffffffffe92b90000)
  到空间 34048K,使用 0% [0xffffffffe92b90000, 0xffffffffe92b90000, 0xffffffffe94cd0000)
 并发标记扫描生成总数 3243264K,已使用 1023755K [0xffffffffe94cd0000, 0xffffffff5ac10000, 0xffffffff5ac10000)
 concurrent-mark-sweep perm gen 总计 262144K,已使用 34997K [0xffffffff5ac10000, 0xffffffff6ac10000, 0xffffffff6ac10000)
2012-07-31T13:21:46.709+0300:149360.928:[GC 149360.930:[ParNew
所需的幸存者大小 17432576 字节,新阈值 4(最大 4)
- 年龄 1:1794816 字节,总共 1794816
- 年龄 2:2864408 字节,总共 4659224
- 年龄 3:72672 字节,总共 4731896
- 年龄 4:86160 字节,总共 4818056
: 280310K->7605K(306688K), 0.9073290 secs] 1304066K->1031418K(3549952K), 0.9100161 secs] [Times: user=9.34 sys=0.15, real=0.91 secs]
GC 调用后的堆=38527(满 3 个):
 par 新一代总计 306688K,使用 7605K [0xffffffffe80010000, 0xffffffffe94cd0000, 0xffffffffe94cd0000)
  伊甸园空间 272640K, 0% 已使用 [0xffffffffe80010000, 0xffffffffe80010000, 0xffffffffe90a50000)
  从空间 34048K,使用 22% [0xffffffffe92b90000, 0xffffffffe932fd490, 0xffffffffe94cd0000)
  到空间 34048K, 0% 使用 [0xffffffffe90a50000, 0xffffffffe90a50000, 0xffffffffe92b90000)
 并发标记扫描生成总数 3243264K,已使用 1023813K [0xffffffffe94cd0000, 0xffffffff5ac10000, 0xffffffff5ac10000)
 concurrent-mark-sweep perm gen 总计 262144K,已使用 34997K [0xffffffff5ac10000, 0xffffffff6ac10000, 0xffffffff6ac10000)
}

JVM参数:

-d64 -服务器\
-XX:+UseParNewGC\
-XX:+UseConcMarkSweepGC\
-Xloggc:./logs/gc_"$DATE".log -XX:+PrintGCDetails -XX:+PrintGCDateStamps \
-XX:+打印GC\
-XX:PrintCMSStatistics=2\
-XX:+PrintTenuringDistribution \
-XX:+PrintHeapAtGC\
-XX:+PrintGCTaskTimeStamps \
-XX:PermSize=256m -XX:MaxPermSize=256m \
-XX:+CMSClassUnloadingEnabled \
-XX:-OmitStackTraceInFastThrow \
-XX:ParallelGCThreads=16\
-XX:ParallelCMSThreads=12\
-Dsun.rmi.dgc.server.gcInterval=0x7FFFFFFFFFFFFFFE -Dsun.rmi.dgc.client.gcInterval=0x7FFFFFFFFFFFFFE\
-Xms3500m -Xmx3500m -Xss192k
4

2 回答 2

0

新空间只有300M,旧空间有3500M?
你应该扩大新空间的大小。
如果可能,请提供您的 jvm arg?

于 2012-08-03T08:28:45.753 回答
0

拥有一个大的伊甸园空间非常便宜,昂贵的是复制保留的对象。

在较短的时间内,您保留了(第二种尺寸)

346199K->73301K, 0.0127033 secs

在你更长的时间里,你保留了更多

1304066K->1031418K(3549952K), 0.9100161 secs

即在第一种情况下,GC 花费的时间更长,因为您保留了更多数据。

在这些情况下,我尝试的第一件事是增加伊甸园的大小,希望在收集发生之前有更多的对象会死掉。

于 2012-08-03T08:10:28.023 回答