我的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。