你面試過程中的攔路虎 MinorGC

業餘草發表於2019-04-26

點選上方“業餘草”,選擇“置頂公眾號”

第一時間獲取技術乾貨和業界資訊!

640?wx_fmt=png

640?wx_fmt=png

昨天,我一個朋友給我說他在抖音上發了一個短視訊,獲得了 300 個贊。我說,你要麼被抖音廢了,要麼就廢了(解除安裝)抖音,要麼你就把抖音玩到極致,成為抖音網紅。

我在下載抖音的時候,玩了一個小時就把它解除安裝了。因為我深知,要想成功,便不要沉迷於能輕易給你短期快感的一切東西。

其實,作為程式設計師也是一樣的。平時工作,你面向百度程式設計。慢慢的你會迷上搜尋,無法擺脫它。不想看書,也不想進步去學習,因為所有的東西,在你眼裡看起來是一搜尋就能解決。其實,這只是你廢了的開始。

今天我給大家講一下,進階中級、高階、專家級。的必備課,GC 中的 MinorGC。

JVM 中的堆,一般分為三大部分:新生代、老年代、永久代。新生代通常使用 MinorGC,老年代通常使用 MajorGC,永久代通常使用 Full GC。

640?wx_fmt=jpeg

新生代主要是用來存放新生的物件。一般佔據堆的1/3空間。由於頻繁建立物件,所以新生代會頻繁觸發 MinorGC 進行垃圾回收。新生代 MinorGC 又通常被分為:Eden 區、ServivorFrom、ServivorTo 三個區。

MinorGC 通常採用複製演算法。流程是先複製,再清空,最後互換。

複製的過程很簡單。首先,Eden 區滿的時候回出發第一次 GC,把存活的物件拷貝到 SurvivorFrom 區,當 Eden 區再次出發 GC 的時候會掃描 Eden 區和 From 區,對這兩個區域進行垃圾回收。

經過這次回收後還存活的物件,則直接複製到 To 區,同時將這些物件的年齡 +1。如果有物件年齡已經達到了老年的標準(年齡閾值,可以通過-XX:MaxTenuringThreshold來設定),則直接複製到老年代。

發生 MinorGC 後,Eden 和 ServivorFrom 區的物件,就被複制到其他區了。

另外一個需要注意的是,如果新建立的物件佔用記憶體很大,則直接分配到老年代。並且 SurvivorTo 區是沒有進行任何回收動作的。

清空就很好理解了。因為經過 MinorGC 後,Eden 和 ServivorFrom 區的物件,就被複制到老年代或者 SurvivorTo 區。這個時候就可以對 Eden 區和 ServivorFrom 進行清空了。

清空之後,還有一個互換動作。就是把 SurvivorTo 的物件互換給 ServivorFrom 區。SurvivorTo 和 SurvivorFrom 互換,原來的 SurvivorTo 稱為下一次 GC 時的 SurvivorFrom 區。部分物件會在 From 和 To
區域中來回複製,如此交換15次(JVM引數 MaxTenuringThreshold決定,預設引數是15),最終如果還是存活,就存入老年代。

這就是 MinorGC,非常的簡單。大家在面試中只需要記住,ServivorTo 一開始是空的,複製演算法流程是先複製,再清空,最後互換,另外一個需要注意的是,如果新建立的物件佔用記憶體很大,則直接分配到老年代。還有就是 Eden 和 Survivor 區的預設佔比為 8:1。回答到這些關鍵點,至少我個人會算面試者過關。

更多面試題,如:GC觸發的條件?什麼時候觸發?GC回收對什麼東西進行回收?GC回收做了什麼或者說是操作了什麼,怎麼操作的?等等這些面試題,可以通過我的面試題小程式學習到!

640?

10T技術資源大放送!包括但不限於:C/C++,Linux,Python,Java,PHP,人工智慧,GO等等。在公眾號內回覆對應關鍵字或框架名字,即可免費獲取!!

640?wx_fmt=png

 你再主動一點點 640?  我們就有故事了

相關文章