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的巨型對象就可以在新生代垃圾回收的時候處理掉