大廠面試題系列:什麼是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 <pid> <period> <times>命令監控當前系統的GC狀況
可以看到在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
https://www.sohu.com/a/436792112_216476