怎么看gc是否正常?如何判别垃圾对象

怎么看gc是否正常?如何判别垃圾对象(1)

JVM热门面试题(几乎每次都会问)

1、如何判别垃圾对象?

判别方法一般有两种:引用计数法和可达性分析。

(1)引用计数法

引用计数法就是给每个对象增加引用计数器,如果引用为0则认为是垃圾。但它无法解决相互引用的问题,因此目前商业JVM都不会使用该方法。

(2)可达性分析

可达性分析就是,从GC root开始搜索,如果一个对象没有引用链连接到GC root节点,则证明此对象不可用,然后根据一定的算法进行回收。在Java中,可以作为GC root的对象包括:

  • 虚拟机栈中引用的对象
  • 方法区中类静态属性引用的对象。
  • 方法区中常量引用的对象。
  • 本地方法栈中JNI(Java Native Interface)引用的对象

2、什么时候会发生GC?

(1)新生代满了后进行minor GC;

(2)在进行Minor GC之前,JVM会检查老年代最大可用剩余连续空间是否大于新生代所有对象总空间,如果大于则安全;如果小于,则:

① HandlePromotionFailure是否为True担保失败,如果是则检查老年代最大可用剩余连续空间是否大于历次晋升到老年代对象的平均大小:

  • 如果大于则尝试进行Minor GC,
  • 如果小于则进行Full GC(Major GC)

② 如果HandlePromotionFailure为False,则直接进行Full GC(Major GC)

(3)老年代空间使用率超过阈值,触发Full GC

(4)元空间(永久代)空间不足时,触发Full GC

(5)CMS GC触发concurrent mode failure(并发清理过程中,老年代正在清理,新生代晋升了新对象/分配大对象放入老年老年代,导致老年代空间不足以存放所有垃圾),触发Full GC

(6)调用System.gc主动触发GC:注意不一定立即回收,甚至不一定回收,只是建议JVM此时是一个执行GC的好时机,可以利用System.runFinalization(); 强制调用已经失去引用的对象的finalize方法,使得justRanFinalization=true,才会触发Runtime.getRuntime().gc();执行回收。

3、Major GC和Full GC有什么区别?

  • MajorGC:清理老年代
  • Full GC:清理整个堆空间,包括年轻代和老年代、永久代 perm gen(1.7-)、元空间 metaspace(1.8 )

事实上很多MajorGC是由MinorGC触发的,因此一般没有细分。

结束语

后面面试官一定会深入问CMS、G1、ZGC,如果想继续跟进了解,请点个关注吧。

关注我,带你像准备高考一样有计划地准备大厂面试!(当前:2022年第2周)

周一:新闻动态——了解岗位要求、薪资,找到目标

周二:编程刷题——高频算法面试题

周三:专业真题——高频连环炮提问

周四:面试提问——HR面的问题如何回答

周五:热门推荐——高效工具

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页