【面试】Java GC过程

问:说一下Java gc过程。

听到这个问题第一反应是很懵😑,等等,Java gc的过程,不问一下哪个垃圾回收器的gc过程吗??不同的垃圾回收器的gc过程不是不一样的吗???一脸懵逼不知道该怎么回答好,把CMS讲一遍还是说几个垃圾回收算法??太嫩了,遇到这种问题大脑就一片空白,总结一下。我觉得这个问题问的实在是让我不知道该怎么回答,既然这样,大致说一下gc的内容应该是可以的吧。


最开始的,肯定是因为jvm堆内存不够才会发生GC(毕竟是GC堆),所以第一句话应该可以这么回答:
“当JVM中的堆内存不足时会触发一次GC”
常规操作下这句话应该没错,不过如果能够扩展成这样,我觉得会更加分:
“当JVM中堆内存新生代中的Eden区内存不足时会触发一次minor gc,当堆内存的老年代内存不足时则会触发一次full gc”
这样,我们就解释了Java 为啥会发生GC了。


接着呢,就要回答怎么去回收垃圾,那么要回收垃圾肯定是需要知道哪些是该回收的垃圾,哪些不是垃圾,因此,第二句话就可以这么回答:
“Java gc最开始的时候,会先找到需要回收的对象,可以通过引用计数法或者可达性分析法来找出需要回收的对象。”
说到这里,如果我们把引用计数法和可达性分析法的概念简单介绍一下,是不是回加分呢,我觉得应该会,因此说完上面的话可以补充:
“引用计数法通过一个变量标记一个对象是否被引用,如果被引用则变量+1,如果引用取消则变量-1,当变量=0时说明该对象可以被回收,这个方法实现比较简单,性能也很好,不过存在循环引用的问题(说出利弊,有得加分吧?)。可达性分析法则是通过判断对象是否能够达到GC root,如果能够达到,则对象存活,否则对象被回收。目前主流的JVM都是采用可达性分析法来找出需要回收的对象。
(当然,说这么多,你可能还需要对循环引用和GC root是什么有所了解,否则面试官要是问这俩东东是啥那可咋整?)


好了,到这里我们也就知道啥时候发生GC(触发条件),GC啥对象了(GC前提),接下来就是真正执行GC了。
其实针对这个问题很懵,因为不同的垃圾回收器采用的垃圾回收算法是不同的,所以不知道该从哪说起比较好,难道要把所有垃圾回收和他们使用什么回收算法都说一遍?那不是很浪费口水???(也许真的是要这样)。
在这里我觉得还是采用一个比较折中的方法比较好,因此,第三句话可以这么说:
做完前面两个步骤,就是真正执行垃圾回收任务,不过不同的垃圾回收器实现的垃圾回收算法是不同的,目前主流的JVM都是采用了分代收集算法,在新生代的垃圾回收器主要采用复制算法,老年代的垃圾回收器如CMS采用标记-清除算法。Java GC的流程大致是这样。
说到这里,我觉得应该就差不多了,该说的基本都已经说了,不过还可以补充一句做一个总结:
“这个过程是比较大致的GC过程,不同的垃圾回收在回收的时候细节也是不太一样的。”


到这里,我们就算把面试官的问题给回答了,接下来就看面试官是否还要在这个问题上做进一步扩展,如果要的话,大致会有以下几个问题的扩展:

  • 说一下minor gc和full gc的区别?
  • 什么是循环引用?
  • 什么样的对象可以作为GC root对象?
  • 说一下垃圾回收算法?(标记-清除算法、复制算法、标记-整理算法、分代收集算法)
  • 说一下CMS垃圾回收器?

—i
总结如上,时刻提醒自己别再犯懵。

如有说得不对的地方,还请各位大佬帮忙指正,谢谢😁

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值