G1和CMS的区别

149 阅读2分钟

1. 背景

最近公司组织架构调整,换了新座位,对面的是个老员工张老板,晚上8点多不知道是谁扯起了这个话题,张老板说他们的项目都换成了G1,而且运行起来也没遇到啥问题,根本不需要啥JVM调优,我也挺尴尬的,因为我也没用G1哈,没有实战经验,只是了解些理论,至此做个对比,学习进步一下

2. 分析区别

  1. 堆的设计思想

  2. G1不会产生空间碎片

  3. G1卡表的维护比CMS复杂

详细解释:

堆的设计思想就是不一样的,CMS是一个经典的划分,有新生代,老年代,eden区,survivor区,G1是把整个堆按照region区域进行划分的,每次回收都是针对region进行回收的,G1的设计目标是region的停顿时间不超过N,N是用户设定的时间,设定的时间少,我就少回收几个region区域,你设定的时间多,我就多回收几个region区域,

CMS是基于标记清除算法的,G1是基于标记整理算法的(从局部来看是基于标记和复制算法)

卡表主要是处理跨代的引用,在G1中是针对每一个region都维护一个卡表,CMS全局只维护一个卡表

STW的阶段有:初始标记,并发标记(不STW),最终标记,筛选回收

3. 如何解决OOM和FULLGC的

方法论:

1. 打印日志
2.获取dump文件
3.MAT分析
4. 修改验证

-获取dump文件的时候,通过配置什么样的参数来获取

      -Xms2g
      -Xmx2g
      -XX:+PrintGCDetails
      -XX:+UseConcMarkSweepGC
      -XX:+HeapDumpOnOutOfMemoryError
      -XX:HeapDumpPath=/data/dump/jvm.dump
      -XX:+HeapDumpBeforeFullGC
      -XX:+HeapDumpAfterFullGC 

-你在MAT分析的时候,你是在哪个tab页面看到他真正有这么一个对象造成的大量的OOM