这一篇简直良心作。
CMS:采用标记清除算法,没有通过复制算法,所以会产生很大碎片问题,而且在清理的时候回导致cpu飙升,进程中断(进程中断是GC普遍现象)
G1:将空间划分成很多块,然后他们各自进行回收。堆比较大的时候可以采用,采用复制算法,碎片化问题不严重。
个人对碎片化问题的了解:空间没有被占满就发生GC,很浪费空间
CMS调优:在业务低峰时进行一次GC,避免在高峰时进行GC
G1调优:根据原本的文章,是出现
2015-06-10T12:00:01.854+0000: 711685.290: [GC pause (G1 Evacuation Pause) (young) [Ref Proc: 4.0 ms] [Eden: 2904.0M(2904.0M)->0.0B(2872.0M)
2015-06-10T12:00:05.899+0000: 711689.335: [GC pause (G1 Evacuation Pause) (young) [Ref Proc: 101.3 ms] [Eden: 2872.0M(2872.0M)->0.0B(216.0M) Survivors: 32.0M->40.0M Heap: 4570.1M(5120.0M)->1706.8M(5120.0M)]
发现是Eden有一些过早的进入老年代。
设置参数:我们通过设置 -XX:G1NewSizePercent=40
,即设置年轻代占用堆最小百分比为40%来解决这个问题。因为有了这个设置,即使引用处理耗时变长,Eden区大小也不可能比这个阈值更低,从而避免对象提早晋升。同时,我们还添加了参数 -XX:+ParallelRefProcEnabled
,从而在Remark阶段多线程并发处理引用对象。
上面这个需要打印出GC日志(下面是jvm命令)
-Xloggc:/home/GCEASY/gc-%t.log 生成日期gc日志
-XX:+PrintGCDateStamps 打印GC时间
-XX:+PrintGCDetails 输出GCdetail
参考https://blog.csdn.net/ning0323/article/details/77093679
大家可以关注你假笨公众号查看jvm参数