JDK8默认使用的是parNew + parOld垃圾回收器,JDK9默认使用的是G1垃圾回收器
- parNew,是一个新生代垃圾回收器,使用多线程和复制算法
- parOld,是一个老年代垃圾回收器,使用多线程和标记-整理算法
面试题:为什么要用CMS垃圾回收器?
答:有的时候,我们系统要求高响应速度,也就是stop the world的时间尽可能少。但是parNew和parOld工作的时候,要求用户线程必须停止,所以对一些要求即时响应的网站来说,应该使用CMS垃圾回收器
-
是什么:CMS,全称是Concurrent-Mark-Sweep,翻译就是并发标记清除,是一个老年代回收器
- 并发:垃圾回收线程和用户线程同时工作
- 标记清除:CMS使用的标记清除算法
-
工作流程:四个阶段,单数阶段需要stop the world,但是时间短
- 初始标记(stw):需要stop the world,仅仅标记所有GC Root对象,速度较快
- 并发标记:沿着GC Root引用链向下查找所有有用的对象
- 重新标记(stw):需要stop the world,修改用户线程影响的标记内容
- 并发清除:清除垃圾
- 是什么:G1,全称叫做Garbage-First,翻译过来就是垃圾优先,其实真实意思就是==>垃圾回收价值高的优先回收
- 区别:
- CMS是老年代回收器,必须配合新生代回收器使用。G1直接就是全代回收
- CMS是真实内存空间。G1是逻辑内存空间,G1将整个内存空间划分为region,这个region既可以划分为新生代,又可以划分为老年代
- 优点:
- CMS回收必须回收整个老年代。G1可以按region回收,比如只回收30个region
- CMS无法按性价比回收。G1可以按性价比回收,比如这个region垃圾占比高,回收这个region我可以获得更多空间,我就可以选择先回收这个region