JAVA基礎篇面試題
文章目錄
- JAVA基礎篇面試題
- 1. 簡述四種垃圾回收器
- 串行垃圾回收器(serial)
- 并行垃圾回收器(Parallel)
- 并發垃圾回收器(CMS)
- G1垃圾回收器
- 2. 配置JVM的垃圾回收器
- 3. 垃圾收集器對應收集區域
- 4. JVM的Client和Server模式是什么
- 5. 垃圾收集器的詳細總結
- Serial收集器
- ParNew收集器
- Parallel Scavenge收集器
- Parallel Old收集器
- CMS收集器
- Serial Old收集器
- G1收集器
- 6. 如何選擇垃圾收集器
- 7. github奇淫技巧
1. 簡述四種垃圾回收器
串行垃圾回收器(serial)
概念:他為單執行緒環境設計且只使用一個執行緒進行垃圾回收,會暫停所有的用戶執行緒,不適合服務器環境;
Serial收集器:單執行緒的新生代收集器,需要暫停其他執行緒,推薦在客戶端模式下選用,由于沒有執行緒互動的開銷,可以獲得最高的單執行緒收集效率,
并行垃圾回收器(Parallel)
概念:多個垃圾收集執行緒并行作業,此時用戶執行緒是暫停的,適用于科學計算/大資料處理;
ParNew收集器:Serial收集器的多執行緒并發版本;
并發垃圾回收器(CMS)
概念:用戶執行緒和垃圾收集執行緒同時執行(不一定是并行,可能交替執行),不需要停頓用戶執行緒;
CMS收集器:以獲得最短回收停頓時間為目的的收集器,基于標記-清除出演算法;
G1垃圾回收器
將堆記憶體分割成不同的區域然后并發的對其進行垃圾回收;
一款主要面向服務端應用的垃圾收集器;使用Mixed GC模式,面向堆記憶體任何部分來組成回收集進行回收,標準就是哪塊記憶體存放的垃圾數量最多,回收收益最大,整體看是標記整理演算法實作,區域看,兩個Region之間是標記復制演算法實作,不會產生記憶體空間碎片,
G1把連續的JAVA堆記憶體劃分為多個大小相等的獨立區域(Region);每一個Region可以充當Eden,Survivor,老年代空間,還有Humongous區域,專門用來存盤大物件,只要大小超過了一個Region的一半的物件即為大物件,
除G1外的圖上其他收集器的特點:
- 年輕代與老年代是各自獨立且連續的記憶體塊;
- 年輕代垃圾收集是1個Eden+2個Survivor,使用復制演算法;
- 老年代收集必須掃描整個老年代區域;
- 都是以盡可能少而快速地執行GC為設計原則;
2. 配置JVM的垃圾回收器
java的GC回收型別有:
UseSerialGC、UseParallelGC、UseConcMarkSweepGC、UseParNewGC、UseParallelOldGC、UseG1GC
# 查看JVM當前回收器
java -XX:PrintCommandLineFlags -version
# 默認的回收器是并行回收
-XX:+UseParallelGC
# 串行回收
-XX:+UseSerialGC
-----------------------------------------
-XX:+UseParNewGC #使用這個引數后會在新生代進行并行回收,老年代仍舊使用串行回收,新生代S區任然使用復制演算法,作業系統是多核CPU上效果明顯,單核CPU建議使用串行回收器,列印GC詳情時ParNew標識著使用了ParNewGC回收器,默認關閉,
-XX:+UseConcMarkSweepGC #并發標記清除,即使用CMS收集器,它是和應用程式執行緒一起執行,相對于Stop The World來說虛擬機停頓時間較少,停頓減少,吞吐量會降低,它使用的是 標記清除演算法,運作程序為四個步驟,分別是 初始標記—并發標識—重新標記—并發清除,它是老年代的收集演算法,新生代使用ParNew收集演算法,默認關閉
-XX:+UseCMSCompactAtFullCollection # Full GC后,進行一次整理,整理程序是獨占的,會引起停頓時間變長,僅在使用CMS收集器時生效,
-XX:CMSFullGCsBeforeCompaction=0 #設定在執行多少次Full GC后對記憶體空間進行壓縮整理,
3. 垃圾收集器對應收集區域

4. JVM的Client和Server模式是什么
32位的WindowsOS,無論硬體如何都默認使用Client的JVM模式;
32位的其他OS,2G記憶體同有2個cpu以上用Server模式,低于則默認使用Client模式;
64位OS都是server模式;
5. 垃圾收集器的詳細總結
Serial收集器
作用范圍:新生代
概念: 單執行緒的新生代收集器,需要暫停其他執行緒,推薦在客戶端模式下選用,由于沒有執行緒互動的開銷,可以獲得最高的單執行緒收集效率,
作業流程:

優勢:古老、簡單、穩定、高效;
? 單核下Client模式的默認新生代垃圾收集器;
不足:需要暫停用戶執行緒,停頓時間長;
? 僅有一個執行緒去回收;
配置:-XX:+UseSerialGC
配置后會默認使用:Serial(新生代)+Serial Old(老年代)的組合;
ParNew收集器
作用范圍:新生代
概念:使用多執行緒進行垃圾回收,是Serial收集器的多執行緒并行版本;會有Stop-The-World情況,常見的應用場景是配合老年代的CMS GC作業,其余和Serial收集器一樣;
作業流程:

優勢:多執行緒、穩定、高效;
? 很多Server模式的默認新生代垃圾收集器;
不足:需要暫停用戶執行緒;
配置:-XX:+UseParNewGC配置后只影響新生代,不影響老年代;
? -XX:ParallelGCThreads設定回收執行緒數量,默認開啟和CPU數目相同的執行緒數;
配置后默認開啟:ParNew(新生代)+Serial Old(老年代)的組合;但JDK8后不推薦此使用并且JDK9后不再支持該默認組合;
Parallel Scavenge收集器
作用范圍:新生代
概念:類似于ParNew收集器,使用復制演算法,并行的多執行緒垃圾收集器,俗稱吞吐量優先收集器,就是說,串行收集器在新生代和老年代并行化;
作業流程:

優勢:1. 可控制吞吐量,根據公式,程式運行100min,垃圾收集時間1min,吞吐量就是99%;高吞吐量意味著高效利用CPU的時間,它多用于在后臺運算不需要太多互動的任務;
吞
吐
量
=
運
行
用
戶
代
碼
時
間
運
行
用
戶
代
碼
時
間
+
運
行
垃
圾
收
集
時
間
吞吐量=\frac{運行用戶代碼時間}{運行用戶代碼時間+運行垃圾收集時間}
吞吐量=運行用戶代碼時間+運行垃圾收集時間運行用戶代碼時間?
? 2.自適應調節策略,虛擬機根據當前系統的運行情況手機性能監控資訊,動態調整這些引數以提供最合適的停頓時間(-XX:MaxGCPauseMillis)或最大吞吐量;
配置:-XX:+UseParallelGC或-XX:+UseParallelOldGC可互相激活,使用該收集器;
? -XX:ParallelGCThreads=N設定回收執行緒數量;
? 當 CPU 數量小于8, ParallelGCThreads 的值等于 CPU 數量,當 CPU 數量大于 8 時,則使用公式GC實際執行緒數N=8 + ((CPU - 8) * 5/8) = 3 +((5*CPU)/ 8)
? 由于GC操作會暫停所有的應用程式執行緒,JVM為了盡量縮短停頓時間就必須盡可能地利用更多的CPU資源,這意味著,默認情況下,JVM會在機器的每個CPU上運行一個執行緒,最多同時運行8個,一旦達到這個上限,JVM會調整演算法,每超出5/8個CPU啟動一個新的執行緒,所以總的執行緒數就是(這里的N代表CPU的數目):ParallelGCThreads = 8 + ((CPU - 8) * 5/8) 此處鏈接
配置第一個自動激活老年代ParallelOld收集器,或者配置ParallelOld老年代收集器,自動激活新生代Parallel收集器;
配置后:新生代使用Parallel Scavenge收集器,老年代使用ParallelOld收集器;
Parallel Old收集器
作用范圍:老年代
概念:是Parallel Scavenge的老年代版本,使用多執行緒的標記-整理演算法;
優勢:提供了吞吐量優先的垃圾收集器
作業流程:

配置:-XX:+UseParallelOldGC
配置后:新生代使用Parallel + 老年代Parallel Old
CMS收集器
作用范圍:老年代
概念:Concurrent Mark Sweep,并發標記清除;是一種以獲取最短回收停頓時間為目標的收集器;適用于在互聯網站或者B/S系統的服務器上,這類應用尤其重視服務器的回應速度,希望系統停頓時間最短,CMS非常適合堆記憶體大,CPU核數多的服務器端應用,也是G1出現之前大型應用的首選收集器;
作業流程:

- 初始標記:標記一下GC Roots能直接關聯的物件,速度很快,需要停頓用戶執行緒,
- 并發標記:從根開始遍歷整個物件圖的程序,程序耗時長,但不需要停頓用戶執行緒,
- 重新標記:為了修正用戶執行緒繼續運作而導致標記變動部分物件的標記記錄,這一階段會比初始階段稍長,但比并發標記時間短,需要停頓用戶執行緒,
- 并發清除:清理掉已死亡的物件,不需要移動存活物件,可以與用戶執行緒同時并發,
優勢:并發收集停頓低,并發是指與用戶執行緒一起執行;
不足:1.對處理器資源非常敏感,會占用一部分執行緒降低總吞吐量,默認啟動的回收執行緒數是 (處理器核心數+3)/4;
? 2.無法處理浮動垃圾,在并發標記和并發清理程序中,會產生新的垃圾物件,CMS無法在當次收集中處理掉他們,只好在下一次清理,這部分垃圾稱為浮動垃圾,
? 3.CMS使用標記清除演算法,會產生大量的碎片化空間,最后需要通過擔保機制對堆記憶體進行壓縮,CMS提供了引數-XX:CMSFullGCsBeforeCompaction(默認0,即每次都進行記憶體整理)來指定多少次CMS收集之后,進行一次壓縮的Full GC;
配置:-XX:+UseConcMarkSweepGC
配置該引數后會自動打開配置-XX:+UseParNewGC
該引數開啟后使用的是:ParNew新生代 + CMS老年代 + Serial Old的收集器組合,Serial Old將作為CMS出錯的后備收集器;
Serial Old收集器
作用范圍:老年代
概念:是Serial的老年代版本,同樣是單執行緒收集器,使用標記-整理演算法,這個收集器也主要是運行在Client默認的java虛擬機默認的老年代垃圾收集器;也是CMS的兜底收集器;
作業流程:

配置:-XX:+UseSerialOldGCJDK8以后配置無效,已被取消;虛擬機會無法啟動,顯示該配置無效;
G1收集器
作用范圍:整個堆
概念:將堆記憶體分割成不同的區域然后并發的對其進行垃圾回收;
一款主要面向服務端應用的垃圾收集器;使用Mixed GC模式,面向堆記憶體任何部分來組成回收集進行回收,標準就是哪塊記憶體存放的垃圾數量最多,回收收益最大,整體看是標記整理演算法實作,區域看,兩個Region之間是標記復制演算法實作,不會產生記憶體空間碎片,
G1把連續的JAVA堆記憶體劃分為多個大小相等的獨立區域(Region);每一個Region可以充當Eden,Survivor,老年代空間,還有Humongous區域,專門用來存盤大物件,只要大小超過了一個Region的一半的物件即為大物件,
記憶體空間:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-6qfjATAk-1631581055744)(./imgs/G1收集器記憶體圖.jpg)]
針對Eden區進行收集,Eden區耗盡后會觸發垃圾收集,主要是小區域收集+形成連續的記憶體塊,避免記憶體碎片;
Eden區的資料移動到Survivor區,假如出現Survivor區空間不夠,Eden區資料會部分晉升到Old區;
Survivor區的資料移動到新的Survivor區,部分資料晉升到Old區;
最后Eden區收集干凈,GC結束,用戶執行緒繼續執行;
作業流程:

- 初始標記:標記GC Roots能直接關聯的物件,并修改TAMS的指標,需要停頓執行緒,耗時短,借助Minor GC時同步完成,實際沒有額外停頓,
- 并發標記:從根開始進行可達性分析,耗時長但可并行,完成后重新處理原始快照下有變動的物件,
- 最終標記:對用戶執行緒做另一個短暫的暫停,用于處理并發階段結束后仍遺留下的少量SATB(原始快照)記錄,
- 篩選回收:統計資料,按回收價值和成本排序,將存活物件復制到空Region并清理舊的Region空間,暫停用戶執行緒,并行完成清理和移動物件,
優勢:高吞吐量,盡可能滿足垃圾收集暫停時間的要求;
? 像CMS收集器一樣,能與應用程式并發執行;
? 整理空閑空間更快,沒有記憶體碎片;
? 可預測GC停頓時間,用戶可以指定期望停頓的時間;
? 保證高吞吐性能和不需要更大的堆空間;
G1相比CMS的不足:
- G1在垃圾收集產生的記憶體占用與程式運行額外執行負載都比CMS高;
- G1卡表實作復雜,每個Region均有一個,消耗記憶體大,CMS只有一個,實作簡單,只需要處理老年代到新生代的參考,節省空間,
- 負載角度:CMS使用寫后屏障更新維護卡表,G1還需要使用寫前卡表跟蹤并發時指標變化,G1需實作類似小訊息佇列的結構,將寫前,寫后屏障放到佇列異步處理,
配置:-XX:+UseG1GC
-XX:G1HeapRegionSize=n指定每個Region磁區的大小(1MB~32MB,是2的冪),默認將整堆劃分為2048個磁區;
-XX:MaxGCPauseMillis=n最大GC停頓時間,JVM盡可能但不保證停頓小于這個時間(毫秒),可以設定為100;
-XX:InitiatingHeapOccupancyPercent=n堆占用了多少的時候就觸發GC,默認45;
-XX:ConcGCThreads=n并發GC使用的執行緒數;
-XX:G1ReservePercent=n設定作為空閑空間的預留記憶體百分比,以降低目標空間溢位的風險,默認值是10%;
6. 如何選擇垃圾收集器
-
單CPU或小記憶體,單機程式
-XX:+UseSerialGC -
多CPU,需要最大吞吐量,如后臺計算型應用
-XX:+UseParallelGC或者-XX:+UseParallrelOldGC -
多CPU,追求低停頓,需要快速回應如互聯網應用
-XX:+UseConcMarkSweepGC-XX:+ParNewGC
7. github奇淫技巧
xxx關鍵詞 in:name,description,readme 表示關鍵字在這其中的;
xxx關鍵詞 stars:>=5000 表示點贊數大于等于五千;
xxx關鍵詞 forks:>=5000 表示forks大于等于五千;
xxx關鍵詞 forks:100…200 stars:80…100 表示關鍵詞forks在100到200內,stars在80到100內;
awesome xxx關鍵詞 表示awesome系列,用來收集學習,工具,書籍類相關的專案;
location:地區,language:語言
location:hangzhou language:java 表示搜索杭州java大佬
給別人的代碼行高亮(單行):git地址#L行號
https://github.com/NervJS/taro/blob/next/package.json#L8
給別人的代碼行高亮(多行):git地址#L行號-L行號
https://github.com/wuba/Taro-Mortgage-Calculator/blob/master/package.json#L2-L10
github下將專案串列收縮快速顯示 按鍵盤t鍵:

其余快捷鍵

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/300201.html
標籤:其他
上一篇:看完這份MySQL 性能調優檔案,我把面試問我資料庫調優的面試官虐哭了
下一篇:人大金倉資料庫使用uuid
