20.互聯網大廠高頻面試題-垃圾回收器(上)

垃圾回收器的種類

在這裏插入圖片描述
常見面試題如上,垃圾回收算法有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一樣。
在這裏插入圖片描述

如何選擇垃圾收集器

在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章