当前位置: 首页 > 工具软件 > Log1 CMS > 使用案例 >

java jvm优化(二)CMS与G1对比

龙焱
2023-12-01

转自https://mp.weixin.qq.com/s?__biz=MzIwMzY1OTU1NQ==&mid=2247485858&idx=1&sn=dad86c9459224bc8a8a2721af2afe3bd&chksm=96cd49eea1bac0f8c15fc1ac7cea55b8de48ec74e6e3a47e954d464561051223010fe14db205&scene=0&xtrack=1#rd

这一篇简直良心作。

CMS:采用标记清除算法,没有通过复制算法,所以会产生很大碎片问题,而且在清理的时候回导致cpu飙升,进程中断(进程中断是GC普遍现象)

G1:将空间划分成很多块,然后他们各自进行回收。堆比较大的时候可以采用,采用复制算法,碎片化问题不严重。

 

个人对碎片化问题的了解:空间没有被占满就发生GC,很浪费空间

 

CMS调优:在业务低峰时进行一次GC,避免在高峰时进行GC

G1调优:根据原本的文章,是出现

  1. 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)

  2. 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参数

 

 

 

 

 类似资料: