Java大廠面試題系列:什麼是Yong GC 和 Full GC.md?

大廠面試題系列:什麼是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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章