Day11

1. 说说GC的可达性分析

  1. 可达性分析算法用来判断对象是否存活。这个算法的基本思路是通过一系列的称为GC Roots的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为“引用链”,如果GC Roots与某个对象之间没有任何引用链相连,即这个对象不可达时,则说明这个对象是不可能再被使用,需要被回收。
  2. 真正宣告一个对象死亡,至少要经历两次标记过程:1.第一次标记,如果对象在进行可达性分析后发现是不可达的,那么就会进行第一次标记,随后进行一次筛选,筛选的条件是这个对象是否有必要执行finalize()方法。假如对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,那么虚拟机会视为“没有必要执行”。否则,该对象将会被放置在一个名为F-Queue的队列之中,并在稍后由一条由虚拟机自动建立的、低调度优先级的Finalizer线程去执行他们的finalize()方法。2.第二次标记,垃圾收集器会对F-Queue中的对象进行第二次小规模的标记。如果对象能在finalize()方法中重新与引用链上的某一个对象建立关联,那么在第二次标记时它将会被移出“即将回收”的集合。如果对象还是不可达的,那就会被回收。

2. 请你说说Java的四种引用方式

  1. Java的引用分为强引用、软引用、弱引用、虚引用4种,这四种强度依次减弱
  2. 强引用是最传统的引用定义,是指在程序代码中普遍存在的引用赋值,如 new Object()这种引用关系。无论任何情况下,只要强引用关系还存在,垃圾回收器就不会回收强引用对象
  3. 软引用是用来描述一些还有用,但非必须的对象。在系统将要发生内存溢出异常前,会把这些对象列进回收范围之中进行回收,如果这次回收之后依然没有足够的内存,才会抛出内存溢出异常。
  4. 弱引用也是用来描述那些非必须的对象。当垃圾收集器开始工作,无论当前内存是否足够,都会回收掉被弱引用关联的对象。
  5. 虚引用是最弱的一种引用关系。一个对象是否有虚引用存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用关联的唯一目的只是为了能在这个对象被收集器回收时收到一个系统通知

3. 请你讲下CMS垃圾回收器

  1. CMS垃圾收集器采用标记清除算法,使用多线程实现,所以它的应用场景一般为服务端系统的老年代。他是一个以达到在垃圾回收期间用户线程低停顿为目标的收集器
  2. CMS垃圾收集器垃圾回收分为四个阶段
    1. 初始标记:只对于GC Roots有直接关联的对象进行可达性分析标记
    2. 并发标记:标记整个GCRoots引用链中的对象,与用户线程并发执行
    3. 重新标记:用于更新在并发标记过程中被复活的对象
    4. 并发清除:清除标记阶段已判断为死亡的对象。该流程与用户线程并发执行
  3. 缺点
    1. 它使用标记清除算法导致内存的碎片化
    2. 会产生在并发清除阶段的浮动垃圾,只有到下一次垃圾回收时才会被清除

4. 请你讲下G1垃圾回收器

  1. G1收集器是一个多线程的采用标记整理算法的,面向混合收集(同时收集新生代和老年代)的一个垃圾收集器。
  2. G1收集器将整个堆内存区域划分为多个大小相等的region,以region为单位进行垃圾收集并获取每个region的收集效率和收集收益,通过一张优先级表对其进行维护
  3. G1垃圾收集器垃圾回收主要包括四个流程:
    1. 初始标记
    2. 并发标记(类似与CMS)
    3. 最终标记在并发标记中维护了一个remember set log用来记录在该阶段发生变化的对象引用关系,在该阶段就是将该信息同步到最终标记信息中
    4. 并发筛选回收:根据优先级表选择分区进行垃圾回收,用户线程STW

5. 请你说说G1和CMS的比较

  1. G1从整体来看是基于标记整理算法实现的收集器,但从局部上看又是基于标记复制算法实现。无论如何,这两种算法都意味着G1在运作期间不会产生内存空间碎片,垃圾收集完成之后能够提供规整的可用内存。
  2. 比起CMS,G1的弱项也可以列举不少。例如在用户程序无论是为了垃圾收集产生的内存占用还是程序运行时的额外执行负载都要比CMS要高。
  3. G1与CMS的选择:目前在小内存上应用CMS的表现大概率要优于G1,而在大内存的应用上G1则能发挥其优势,这个优劣势的Java堆容量平衡点通常在6GB到8GB之间
最后修改:2024 年 06 月 08 日
如果觉得我的文章对你有用,请随意赞赏