下面这个例子针对 Service S的优化,对于最近被部署的 Service S,Full GC花费了太长的时间。

    请看 jstat –gcutil的执行结果。

    1
    2
    S0 S1 E O P YGC YGCT FGC FGCT GCT
    12.16 0.00 5.18 63.78 20.32 54 2.047 5 6.946 8.993

    最左边的Perm 空间对于最初的GC优化不是很重要,这一次YGC参数的值更加有用。

    Minor GC和Full GC的平均值如下表所示

    3Service SMinor GC Full GC的平均执行时间

    GC 类型

    GC 执行次数

    GC 执行时间

    平均

    Minor GC

    54

    2.047

    37 ms

    Full GC

    5

    6.946

    1,389 s

    最重要的是下面两个数据

    • 新生代实际使用空间: 212,992 KB
    • 老年代实际使用空间: 1,884,160 KB

    因此,总的内存空间为2GB,不算Perm空间的话,新生代与老年代之比为1:9。通过jstat和-verbosegc 日志进行数据收集,并把三台服务器按照如下方式设置。

    • NewRatio=2
    • NewRatio=3
    • NewRatio=4

    一天之后,检查系统的GC日志后发现,在设置了NewRatio参数后很幸运的没有发生Full GC,

    为什么?

    • NewRatio=2: 45 ms
    • NewRatio=3: 34 ms
    • NewRatio=4: 30 ms

    我们看到NewRatio=4 是最佳的参数,虽然它的新生代空间最小,但GC时间确最短。设定这个参数之后,系统没有执行过Full GC。

    为了说明这个问题,下面是服务之星一段时间后执行jstat –gcutil的结果

    1
    2
    S0 S1 E O P YGC YGCT FGC FGCT GCT
    8.61 0.00 30.67 24.62 22.38 2424 30.219 0 0.000 30.219

    你可能会认为因为服务器接受的请求少才导致的GC执行频率下降。实际上,虽然Full GC没有执行,但是Minor GC被执行了 2,424次。