jvm垃圾回收器(串行、吞吐量優先、響應時間優先、G1)


1、垃圾回收器的分類

(1)串行

單線程:垃圾回收發生的時候,其它線程都暫停

適用於堆內存較小的時候,適合個人電腦

(2)吞吐量優先

多線程

適合於堆內存較大,需要多核CPU

讓單位時間內STW的時間最短

(3)響應時間優先

多線程

適合於堆內存較大,需要多核CPU

注重的是垃圾回收時STW的時間最短

 

2、串行垃圾回收器

Serial:工作在新生代,采用的是復制算法

SerialOld:工作在老年代,采用的是標記整理算法

垃圾回收的時候此線程不阻塞,其他線程都處於阻塞狀態

 

3、吞吐量優先

UseParalleGC:Paralle是並行的意思,UseParalleGC工作在新生代,采用復制算法

UseParalleoldGC:工作在老年代,采用標記整理算法

只要打開一個,另外一個就默認開啟

-XX:+UseAdaptiveSizePolicy:自動調整伊甸園區和幸存區的比例

-XX:+GCTimeRatio=ratio:1/(1+radio)垃圾處理的目標(radio默認為99)

-XX:MaxGCPauseMillis=ms:最大暫停(默認200ms)

-XX:ParallelGCThreads=n:垃圾處理線程的數量

4、響應時間優先

 -XX:UseConcMarkSweepGC:工作在老年代

-XX:+UseParNewGC:工作在新生代

初始標記:標記根對象,較快

並發標記:不用STW,和用戶線程並發執行

並發清理:和其他用戶線程並發執行

缺點:會產生碎片

 

5、G1(Garbage First,jdk9默認)

(1)適用場景

同時注重吞吐量和低延遲,默認的暫停目標是200ms

超大堆內存,會將堆划分為多個region

整體上是標記+整理算法,兩個區域之間是復制算法

(2)垃圾回收階段

Young Collection:對新生代的垃圾收集

 每一個區域都可以單獨作為伊甸園區、幸存區和老年代

新生代垃圾回收:復制算法,會STW,將幸存的對象拷貝到幸存區:

晉升到老年代:

Young Collection+Concurrent Mark:新生代的垃圾收集+並發標記(老年代垃圾超過閾值)

會進行初始標記(標記根對象)和並發標記(從根對象出發,標記其它的一些對象,老年代超過閾值觸發)

Mixed Collection:混合收集(對新生代、老年代進行垃圾收集,規模較大)

 

 老年代采用的也是復制算法,G1根據最大暫停時間有選擇地進行垃圾回收。達不到設置的最大暫停時間,會從老年代挑出回收價值最高的區域

 

6、Full GC

 其中CMS和G1老年代內存不足,分兩種情況,對於G1當老年代的內存超過閾值的時候就會觸發並發標記和混合收集,如果回收的速度高於用戶線程產生垃圾的速度的話,這個時候還處於並發垃圾收集的階段,還不是Full GC。當垃圾回收的速度趕不上垃圾收集的速度,就會退化為串行的收集,觸發Full GC

CMS是並發收集失敗的時候才會觸發Full GC

 

7、jdk8字符串去重

(1)優點和缺點

優點:節省大量代碼

缺點:略微多占用了cpu時間,新生代回收時間略微增加

(2)原理

將所有新分配的字符串放入一個隊列,當新生代回收的時候,G1並發檢查是否有字符串重復,如果他們的值一樣,就讓他們引用同一個char數組(string本質是char數組)

注意:與string.intern不同,string.intern()關注的是字符串對象,而字符串去重關注的是char數組,在jvm內部使用了不同的字符串表

 

8、jik8並發標記卸載

所有對象經過並發標記后,就能知道哪些類不再被使用,當一個類加載器的所有類不再使用,則卸載它所加載的所有類

 

9、jdk8回收巨型對象

(1)定義

一個對象大於region的一半時,稱之為巨型對象

(2)特征

G1不會對巨型對象進行拷貝

回收時被優先考慮

G1會跟蹤老年代所有的incoming引用,這樣老年代incoming引用為0的巨型對象就可以在新生代垃圾回收的時候處理掉

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM