大厂面试题系列:什么是YoungGC 和 FullGC
上周出去面试的一位精神小伙,回来后突然不精神了,一问,原来面试过程中面试官让他解释一下,「什么是YoungGC 和 FullGC?」
他按照面试宝典上的答案给面试官说了,但不是面试官想要的答案啊,瞬间整个人就怂了,最后被怼的无言以对。
确实,在JVM优化部分,我们会接触到 什么 MinorGC,YoungGC、FullGC、OldGC、MajorGC 等等,感觉这些各种乱七八糟都是什么啊,很容易弄混。
而这些词呢,在面试的过程中,也经常被问到。面试官问的不深,有可能只是考一下你对这些名词的理解。
而且说实话,这些名词,翻译来翻译去,在业内也没有完全统一的标准,而且有时在不同的书上, 不同的文章里,对同一个名词的定义都是有所不同的。
所以,是很有可能出现:你的理解和面试官的理解是不同的,这时一定不要慌啊。
在面试时遇到这种情况,「一个名词可能有的多种不同的理解」时,我们要尽可能的都做出说明,避免歧义,防止面试官对你产生不好的误会,甚至自己怀疑自己。
MinorGC,YoungGC
ok,我们首先来看最简的慨念: MinorGC [ˈmaɪnər] / YoungGC
其实所谓的 MinorGC,也可以称为 YoungGC,这二者是相同的,都是专门针对于新生代的GC.
「新生代」也可以称为「年轻代」,在新生代的Eden内存区域被占满之后,就会触发「新生代」的GC,或者叫「年轻代」的GC,也就是所谓的 MinorGC 和 YoungGC
FullGC
从字面上意思其实就可以理解了,“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日志中,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