为什么G1碰撞器要花费大量时间用于对象副本



我的java选项是:

java -Dsun.zip.disableMemoryMapping=true -Xmx18g -Xms8g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=45 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log -XX:NewSize=1500m -XX:MaxNewSize=1500m

这是我的GC日志:

    2016-12-22T09:45:51.567 0800:145356.468:[GC暂停(G1疏散暂停)(Young)(Young),4.0553815秒]        [并行时间:4052.5毫秒,GC工人:28]          [GC Worker Start(MS):Min:145356469.0,AVG:145356469.4,最大:145356469.9,diff:0.9]          [EXT根扫描(MS):最小:0.6,AVG:1.0,最大:1.8,diff:1.2,sum:29.1]          [Update RS(MS):Min:12.0,AVG:12.4,Max:13.2,diff:1.2,sum:348.4]             [加工缓冲区:最小:9,AVG:13.5,最大:24,diff:15,sum:379]          [扫描RS(MS):最小:0.0,AVG:0.1,最大:0.2,diff:0.2,sum:2.3]          [代码根扫描(MS):最小:0.0,AVG:0.0,最大:0.1,diff:0.1,sum:1.1]          [对象副本(MS):最小:28.7,AVG:1927.0,最大:4037.8,diff:4009.1,sum:53956.0]          [终止(MS):最小:0.0,AVG:2111.2,最大:4009.0,diff:4009.0,sum:59114.4]             [终止尝试:最小:1,AVG:2.2,Max:5,diff:4,sum:63]          [GC Worker其他(MS):最小:0.0,AVG:0.1,最大:0.2,diff:0.1,sum:2.0]          [GC Worker Total(MS):Min:4051.4,AVG:4051.9,最大:4052.4,diff:1.0,sum:113453.2]          [GC Worker End(MS):Min:145360521.3,AVG:145360521.3,最大:145360521.4,diff:0.1]       [代码根修复:0.1 ms]       [代码根清除:0.0 ms]       [Clear CT:0.4 ms]       [其他:2.4 ms]          [选择CSET:0.0 ms]          [REF PROC:0.4 MS]          [参考ENQ:0.0 ms]          [redirty卡:0.5毫秒]          [巨型登记册:0.1 ms]          [Humongous Reclaim:0.0 ms]          [免费CSET:0.6 ms]       [Eden:1424.0m(1424.0m) -> 0.0B(1416.0m)幸存者:76.0m-> 84.0m堆:3475.6m(8192.0m) -> 2071.7m(8192.0m)]     [TIMES:用户= 54.84 sys = 56.91,真实= 4.06秒]

我的CPU有40个内核,有时GC会导致很多时间。我发现大部分时间都花在对象副本上,我想知道在哪种情况下会发生,以及我该怎么做才能优化GC ...

[对象复制(MS):Min:28.7,AVG:1927.0,Max:4037.8,diff:4009.1,sum:53956.0] Max比最小的要大得多,也许我可以减去GC工人?

i使用-xx:grounpagesizeInbytes = 32m,然后将服务移至另一台Linux服务器(我发现CPU运行队列有时很大)。然后发现不超过1秒GC。

最新更新