Java面试题

题目

聊聊 Jvm 的垃圾收集器

答案

概述

Jvm 垃圾收集器分为新生代垃圾收集器和老年代垃圾收集器。

新生代垃圾收集器

  1. Serial 收集器:单线程接口,简单高效。
  2. ParNew 收集器:多线程。
  3. Parallel Scavenge 收集器:吞吐量相关。

老年代收集器

  1. Serial Old 收集器:标记整理算法。
  2. Parallel Old 收集器:标记整理算法。
  3. CMS 收集器:标记清除算法。

拓展

G1垃圾收集器

将所有区域化分成 Region 块,对 region 块里面的数据进行回收。它的工作范围是整个新生代和老年代。

G1收集器步骤

  1. 初始标记:仅标记 GC Roots (栈中引用对象、方法区中类静态属性引用变量、方法区中类常量引用变量、本地方法栈 JNI 引用对象)能直接到的对象,并且修改TAMS(Next Top at Mark Start)的值,让下一阶段用户程序并发运行时,能在正确可用的 Region 中创建新对象。(需要线程停顿,但耗时很短。
  2. 并发标记:从 GC Roots 开始对堆中对象进行可达性分析,找出存活对象。(耗时较长,但可与用户程序并发执行)
  3. 最终标记:为了修正在并发标记期间因用户程序执行而导致标记产生变化的那一部分标记记录。且对象的变化记录在线程Remembered Set Logs里面,把 Remembered Set Logs 里面的数据合并到 Remembered Set 中。(需要线程停顿,但可并行执行。)
  4. 筛选回收:对各个 Region 的回收价值和成本进行排序,根据用户所期望的 GC 停顿时间来制定回收计划。(可并发执行)

CMS收集器步骤

  1. 初始标记:标记GC Roots能直接到的对象。速度很快但是仍存在Stop The World问题。
  2. 并发标记:进行GC Roots Tracing 的过程,找出存活对象且用户线程可并发执行
  3. 重新标记:为了修正并发标记期间因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录。仍然存在Stop The World问题。
  4. 并发清除:对标记的对象进行清除回收。