源码时代送攻略:Java大厂面试题系列:什么是Yong GC 和 Full GC.md?

大厂面试题系列:什么是YoungGC 和 FullGC

上周出去面试的一位精神小伙,回来后突然不精神了,一问,原来面试过程中面试官让他解释一下,「什么是YoungGC 和 FullGC?」

他按照面试宝典上的答案给面试官说了,但不是面试官想要的答案啊,瞬间整个人就怂了,最后被怼的无言以对。

确实,在JVM优化部分,我们会接触到 什么 MinorGC,YoungGC、FullGC、OldGC、MajorGC 等等,感觉这些各种乱七八糟都是什么啊,很容易弄混。

而这些词呢,在面试的过程中,也经常被问到。面试官问的不深,有可能只是考一下你对这些名词的理解。

而且说实话,这些名词,翻译来翻译去,在业内也没有完全统一的标准,而且有时在不同的书上, 不同的文章里,对同一个名词的定义都是有所不同的。

所以,是很有可能出现:你的理解和面试官的理解是不同的,这时一定不要慌啊

在面试时遇到这种情况,「一个名词可能有的多种不同的理解」时,我们要尽可能的都做出说明,避免歧义,防止面试官对你产生不好的误会,甚至自己怀疑自己。

MinorGC,YoungGC

ok,我们首先来看最简的慨念: MinorGC [ˈmaɪnər] / YoungGC

image

其实所谓的 MinorGC,也可以称为 YoungGC,这二者是相同的,都是专门针对于新生代的GC.

「新生代」也可以称为「年轻代」,在新生代的Eden内存区域被占满之后,就会触发「新生代」的GC,或者叫「年轻代」的GC,也就是所谓的 MinorGC 和 YoungGC

FullGC

image

从字面上意思其实就可以理解了,“Full” 就是整个的,完整的意思,所以就是对 JVM 进行一次整体 垃圾回收,把各个内存空间区域,不管是新生代,老年代,永久代的垃圾统统都回收掉。

但这里,往往有一些人会把 FullGC 和 OldGC 混淆:

说实话,不同的人对同一个概念肯定会有不同理解和看法的,这个大家可以相互讨论 。

有的人也把MajorGC [ˈmeɪdʒər] 和FullGC划等号,也有人把 FullGC 和 OldGC 划等号,其实这些概念在国内混淆还是很严重的。

那么为什么会这样呢:

其实大家在很多地方看到一个说法,意思就是说: 「OldGC执行的时候,一般都会带上一次YoungGC」

很多人不理解,其实如果你把各个GC触发的条件分析清楚了就知道了,

(1)YoungGC 就是在新生代的Eden区域满了之后,就会触发,采用复利算法来回收新生代的垃圾

(2)发生YoungGC之前往往会先检查一下老年代的空间,如果说明本次YoungGC后可能升入老年代对象的大小,可能超过了老年代当前可用内存空间,此时必须先触发一次OldGC给老年代腾出更多的空间,然后再执行YoungGC

所以,一般OldGC 很可能就是在 YoungGC 之前触发,所以自然OldGC一般都会跟一次YoungGC连带关联在一起了。 那他触发的实际上就是FullGC,因为我们知道 FullGC会包含YoungGC、OldGC和永久代的GC 也就是说触发FullGC的时候,可能就会去回收年轻代、老年代和永久代三个区域的垃圾对象。

我们可以通过jstat -gcutil 命令监控当前系统的GC状况

image

可以看到在GC日志中,FullGC会同时对年轻代、老年代、永久代都进行了垃圾回收。

最后,小结一下:

YoungGC 就是年轻代的gc ,OldGC就是老年代的gc ,FullGC是针对年轻代、老年代、永久代进行的整体的gc 。 而且还有几个其他的名词跟他们有重叠的含义,

比如 MinorGC也可以称之为YoungGC,MajorGC也可以称之为OldGC,

有的人也把Major GC和Full GC划等号,也有人把Full GC和Old GC划等号。

所以以后大家在外面跟人聊起各种GC名词的时候,一定要问清楚他指代的到底是什么哦!

参考文章:

《深入理解JVM》(周志明著)

https://www.cnblogs.com/jajian/p/10578628.html

你可能感兴趣的:(源码时代送攻略:Java大厂面试题系列:什么是Yong GC 和 Full GC.md?)