乾貨!Java面試不得不知的JVM知識

本文是個人學習總結,每個問題回答不是很全,只是作爲一個思路,讀者可根據這些常問題目、思路再去補全自己的知識。

java中什麼是垃圾?什麼是GC Roots
簡單來說就是內存中不再被使用的對象。通過一系列被稱爲"GC Root"的對象作爲起始點,從這些節點向下搜索,
搜索走過的路徑就叫引用鏈,當一個對象到GC root沒有任何引用鏈就是不可達,就是垃圾。
可以作爲GC root對象的:
1.棧中引用的對象
2.方法區中類靜態屬性引用的變量
3.方法區中常量引用的對象
4.本地方法棧中JNI引用的對象。
請問如何盤點查看JVM系統默認值
有三類參數:
1.標配參數如-version -help等。
2.X參數比如-Xlint,-Xcomp,-Xmixed
3.XX參數:Boolean類型;KV類型;jinfo -flag 具體參數 java進程編號
java -XX:+PrintFlagsInitial  HelloWorld 查看JVM初始的參數,相當於默認值
java -XX:+PrintFlagsFinal -XX:MetaspaceSize=512m HelloWorld 查看修改後的JVM的參數
java -XX:+PrintCommandLineFlags -version查看JVM的使用值(用戶修改過的)
":="代表被修改過,"="初始的,沒被修改過的
你常用的JVM配置參數
-Xms,初始大小內存,默認爲物理內存1/64,等價於-XX:InitialHeapSize
-Xmx,最大內存,默認爲物理內存1/4,等價於-XX:MaxHeapSize
-Xss,設置單個線程棧的大小,一般是512Kb-1024Kb之間,等價於-XX:ThreadStackSize
-Xmn 設置年輕代大小
-XX:MetaspaceSize設置元空間的大小
-XX:+PrintGCDetails
-XX:SurvivorRatio=8 年輕代 Eden區和suvivor單區的比例
-XX:NewRatio=2 新生代與老年代在堆結構的佔比
-XX:MaxtTenuringThreshold 對象躲過多少次回收可以進入老年代

談談軟引用、強引用、弱引用、虛引用分別是什麼
強引用:默認的引用,如何都不會被回收。
軟引用:SoftReference類,當內存不夠用時,會回收它指向的對象。
弱引用:WeakReference類,不管內存夠不夠,一旦發生GC,都會被回收
上面兩種引用的應用場景:緩存,當內存不足時,就會回收一些緩存
WeakHashMap 當key不再被引用時,發生垃圾回收,則回將映射關係從map中移除
虛引用:完全不能決定對象的生命週期,PhantomReference,搭配ReferenceQueue一起使用
你常見的JVM異常
StackOverFlowError: 棧溢出
OutOfMemoryError:java heap space
OutofMemoryError: GC overhead limit意味着GC次數很多,但是沒效果,反而引起CPU過高
OutOfMemoryError: Direct buffer memory  NIO MetaSpce is in native memory now
OutOfMemoryError: unable to create new native thread 因爲一個進程能創建的線程數是有限的,比如
linux限制一個進程能創建1024個線程,理論值。
OutOfMemoryError: MetaSpace
垃圾回收算法及垃圾回收器
標記-清除算法:首先標記出所有需要回收的對象,在標記完成後統一回收所有被標記的對象。
複製算法:它將可用內存按找一定比例分配,每次回收都複製到某個區。參考新生代。
標記-整理算法:不像複製算法那樣去浪費一部分空間,而是標記-清除,之後再將對象整理到一側去。
分代收集算法:即不同的代用不同的算法。
串行垃圾垃圾回收器:它爲單線程環境設計,會暫停所有的用戶線程。
並行垃圾回收器:多個垃圾收集線程並行工作,此時用戶線程是暫停的。
CMS併發垃圾回收器:可以和用戶線程一同進行
G1:
默認的垃圾收集器有哪些
Serial收集器:串行收集器,STW,不代表只用一個CPU或一個線程去回收,而是代表必須暫停其他所有的工作線程,
直到它收集結束。Client模式新生代默認。採用複製算法,gc日誌有DefNew字眼,默認老年代搭配爲Serial Old

ParNew:Serial收集器的多線程版本。Server模式下,新生代的首選,目前它是除了Serial收集器之外,唯一能夠與
CMS收集器配合工作的。對於單核CPU不見得比Serial好。當新生代使用ParNew默認老年代搭配爲SerialOld,當使用
-XX:+UseConcMarkSweepGC,那麼新生代就會默認爲ParNew。採用的是複製算法,gc日誌帶有ParNew字眼。

Parallel Scavenge: 也是一個並行垃圾收集器,但是它注重吞吐量。
1.設置最大垃圾回收時間,以犧牲新生代空間和吞吐量爲代價
2.能設置吞吐量
3.-XX:+UseAdaptiveSizePolicy,一種自適應策略,虛擬機根據當前系統的運行情況收集性能監控信息,動態調整
-Xmn、Eden與Survivor比例等。複製算法。默認和Paralle Old搭配。gc日誌有PSYoungGen

SerialOld:Serial收集器的老年代版本,標記整理算法,使用場景:
1.與Paralledl Scavenge收集器搭配使用。
2.作爲CMS收集器的後備預案。

Paralle Old:Paralle Scavenge收集器的老年代版本,因爲Parralel Scavenge和SerialOld搭配使用,吞吐量
甚至還不如ParNew+CMS這樣的組合,直到Parallel Old的出現,一切開始改變。

CMS收集器:一款以獲取最短回收停頓時間爲目標的收集器。併發標記清除。
 
G1:它將整個Java堆劃分爲多個大小相等的獨立區域,雖然還保留有新生代、老年代的概念,但新生代和老年代不再是
物理隔離的,它們都是一部分Region的集合。
JVM client模式與Server模式的區別
編譯器方面:虛擬機運行在client模式時,使用的是一個代號爲c1的輕量級編譯器,而server模式啓動時,虛擬機採用
的是相對重量級,代號爲c2的編譯器;c2相對c1編譯徹底,服務起來後,性能更高。

gc方面:client模式下的新生代默認爲Serial單線程版,而server模式下默認爲Serial多線程版。
啓動方面:client模式啓動快,編譯快,內存佔用少,針對桌面應用程序設計,優化客戶端環境啓動時間。

server模式啓動慢,編譯更完全,編譯器是自定義編譯器,效率高,針對服務端應用設計,優化服務器的最大化
程序執行速度。
談談G1收集器
G1將新生代,老年代的物理空間劃分取消了,取而代之將堆劃分爲若干個區域,它仍屬於分代收集器。
這些區域有Eden、Survivor、Old、Humongous。G1在回收時將對象從一個區域複製到另一個區域,完成了清理工作。
這就意味着,G1可以進行整理,不會產生內存碎片。
發佈了70 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章