1、新生代和老年代垃圾回收器java
java內存的堆結構(新生代,老年代,永久代(1.8爲元空間(Metaspace))都是對方法區的實現)git
- 針對新生代的垃圾回收器共有三個:Serial,Parallel Scavenge 和 Parallel New。這三個採用的都是標記 - 複製算法。其中,Serial 是一個單線程的,Parallel New 能夠當作 Serial 的多線程版本。Parallel Scavenge 和 Parallel New 相似,但更加註重吞吐率。此外,Parallel Scavenge 不能與 CMS 一塊兒使用。
- 針對老年代的垃圾回收器也有三個:剛剛提到的 Serial Old 和 Parallel Old,以及 CMS。Serial Old 和 Parallel Old 都是標記 - 壓縮算法。一樣,前者是單線程的,然後者能夠當作前者的多線程版本。CMS 採用的是標記 - 清除算法,而且是併發的。除了少數幾個操做須要 Stop-the-world 以外,它能夠在應用程序運行過程當中進行垃圾回收。在併發收集失敗的狀況下,Java 虛擬機會使用其餘兩個壓縮型垃圾回收器進行一次垃圾回收。CMS的四個主要階段,以及各個階段的工做內容。 1. Init-mark初始標記(STW) ,該階段進行可達性分析,標記GC ROOT能直接關聯到的對象,因此很快。 2. Concurrent-mark併發標記,由前階段標記過的可達性對象出發,全部可到達的對象都在本階段中標記。 3. Remark重標記(STW) ,暫停全部用戶線程,從新掃描堆中的對象,進行可達性分析,標記活着的對象。由於併發標記階段是和用戶線程併發執行的過程,因此該過程當中可能有用戶線程修改某些活躍對象的字段,指向了一個未標記過的對象,對象在併發標記開始時不可達,可是並行期間引用發生變化,變爲對象可達,這個階段須要從新標記出此類對象,防止在下一階段被清理掉,這個過程也是須要STW的。特別須要注意一點,這個階段是以新生代中對象爲根來判斷對象是否存活的。 4. 併發清理,進行併發的垃圾清理。因爲 G1 的出現,CMS 在 Java 9 中已被廢棄 。
- G1(Garbage First)是一個橫跨新生代和老年代的垃圾回收器。實際上,它已經打亂了前面所說的堆結構,直接將堆分紅極其多個區域。每一個區域均可以充當 Eden 區、Survivor 區或者老年代中的一個。它採用的是標記 - 壓縮算法,並且和 CMS 同樣都可以在應用程序運行過程當中併發地進行垃圾回收。G1 可以針對每一個細分的區域來進行垃圾回收。在選擇進行垃圾回收的區域時,它會優先回收死亡對象較多的區域。這也是 G1 名字的由來。
- ZGC,即將到來的 Java 11 引入了 ZGC,宣稱暫停時間不超過 10ms。ZGC能夠看[1]和[2]。
2、GC日誌格式github
Java GC日誌能夠經過 +PrintGCDetails開啓
算法
以ParallelGC爲例多線程
YoungGC日誌解釋以下 :併發

FullGC:app

[2]dinfuehr.github.io/blog/a-firs…ui