(面试题)讲讲常用的垃圾回收器

156 阅读2分钟

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