文章目錄
垃圾回收器的種類
常見面試題如上,垃圾回收算法有4種(引用計數,複製拷貝,標記清除,標記整理)。
那麼,垃圾回收器談談你的理解:
俗稱:串行回收,並行回收,併發標記清除,G1. 垃圾回收的方式:串行,並行,併發,g1.截至到java10,說這個都沒問題。
java11.12又多了一種叫zgc。目前講解以java8爲例,先講這四種。
串行並行併發G1四大垃圾回收方式
串行垃圾回收器:爲單線程環境設計且只使用一個線程進行垃圾回收,會暫停所有的用戶線程,所以不適合服務器環境。
回收可視化效果如下:藍色爲程序執行,黃色爲垃圾回收,當發生垃圾回收的時候,正常的程序線程要被暫停。
並行垃圾回收器:多個垃圾回收線程並行工作,此時用戶線程是暫停的,適用於科學計算,大數據處理首臺處理等弱交互場景。
回收可視化過程如下:
併發垃圾回收器:用戶線程和垃圾回收線程同時執行(不一定是並行,可能是交替執行),不需要停頓用戶線程,互聯網公司多用他,適用對響應時間有要求的場景。
回收過程可視化:
G1:是garbage first的縮寫。從java7開始論證,java8就可以使用了,歷經了10年的精心準備和論證。從java9開始,默認的垃圾回收方式就是g1.java11又變成了zgc。G1了垃圾回收器將堆內存分割成不同的區域然後併發的對其進行垃圾回收。
總結
截至到java8,主要是這三種垃圾回收器。截止到java8,包括java8如果是互聯網公司,都會改成CMS。
如何查看默認的垃圾回收器
天上飛的理念,需要地上跑的實現。垃圾回收算法是思想,需要去落地。
本篇博客的內容是對上述的思想進行繼續深化,繼續落地實現。也就是具體的垃圾回收器。
如何查看默認的垃圾收集器
java8默認是並行垃圾回收思想。
jvm默認的垃圾收集器有哪些
可以查看openjdk的源碼:
上面有6種,第七種已經被廢棄和淘汰了叫做serialOldGC。一共是7種。
7大垃圾收集器概述
G1可以覆蓋young和old區,都可以覆蓋。
打錯號的可以不用了。
GC之約定參數說明
defnew:默認新生代垃圾回收器。
tenured:老年代用的垃圾回收器。
parnew:在新生代用並行回收。
psyoungGen:在新生代使用並行垃圾回收器。
paroldgen:在老年區域使用並行垃圾回收。
server/client模式
GC之Serial收集器
一旦配置了新生代的垃圾回收機制,老年代就自動配置了,比如:新生代是串行,老年代就是串行。
串行gc(serial)/(serial copying)
STW:stop the worldl。
代碼演示:
vm參數:堆空間10m,打印gc細節,打印簡單版的jvm參數,使用串行垃圾回收器。
代碼:
運行效果:
設置串行垃圾回收器之後,新生代就會用默認的串行垃圾回收器DefNew。養老帶用的也是串行垃圾回收器。參考下圖的連線。
GC之ParNew收集器
這個只改變新生代爲並行的模式,老年代還是串行的。最佳實踐可以看下圖的連線,配合老年代的CMS。
修改vm參數爲下圖:
跟上面同樣的代碼的運行結果:
確實改變了垃圾回收器爲parNewGC。
新生代的GC方式改爲了ParNew的gc方式。新生代從串行收集變成了並行收集。
養老區沒發生改變,還是串行垃圾回收,但是jvm提示已經廢棄了,看下圖的紅字。
言下之意,並行新生代+串行老年代已經不推薦使用了,看下圖:
可以修改並行進行垃圾回收線程的數量:
GC之Parallel收集器
總結一下上面兩個垃圾回收器:
新生代單線程+老年代單線程----->serial
新生代多線程+老年代單線程----->ParNew
java8安裝之後,使用的是parallel Scavenge 收集器。他是這樣的:
新生代多線程+老年代多線程----->Parallel Scavenge
詳細介紹:
爲啥會互相激活呢?可以看jdk的源碼,這種組合的策略是或者的關係,他倆走的是一個邏輯,所以可以互相激活。
代碼演示,vm參數:
運行截圖:新生代是並行GC,老年代也是並行GC。這就是parallelgc的具體的執行策略。
GC之ParallelOld收集器
接下來介紹養老區的垃圾回收器。
隨着jdk版本的更迭,爲了保證吞吐量,垃圾回收器進行了優化。
設置vm參數:
對於java8,默認就是這個,不用加了。對於java8,parallel收集器和parallelOld收集器是互相激活的。
運行代碼,查看控制檯結果:
新生代=並行,老年代=並行。java8不做配置,也是這套東西。
GC之CMS收集器
CMS是標記清除算法的垃圾回收器實現。
詳細介紹:
簡單來說,互聯網公司,做優化的話,就應該配置成CMS收集器。
注意看下圖的連線,說明了這個組合。
CMS的詳細過程-四步
結合上面2圖,第一步初始標記是停頓的。
第二步,併發標記,和用戶線程一起,不需要停頓。
第三步:重新標記,需要暫停。
第四步:併發清除
四步概述
優缺點
CMS配置觸發
執行結果如下:
這種配置方法完成了下圖的組合:新生代還是ParNew,老年代是CMS。
GC之SerialOld收集器
這是用在老年代的串行垃圾回收器。
vm參數:
運行結果:
基本可以不用了。
6種垃圾回收器總結
底層代碼:
實際代碼就是設置vm參數。
故意配置一下多個垃圾回收器,會如何呢?
第一組實驗結果:實際跟配置一個效果一樣。
第二組實驗結果:也是跟只配置cms一樣。
如何選擇垃圾收集器