一、知識點彙總
JVM是Java運行基礎,面試時一定會遇到JVM的有關問題,內容相對集中,但對只是深度要求較高.
其中內存模型,類加載機制,GC是重點方面.性能調優部分更偏向應用,重點突出實踐能力.編譯器優化和執
行模式部分偏向於理論基礎,重點掌握知識點.需瞭解
- 內存模型 各部分作用,保存哪些數據.
- 類加載 雙親委派加載機制,常用加載器分別加載哪種類型的類.
- GC 分代回收的思想和依據以及不同垃圾回收算法的回收思路和適合場景.
- 性能調優 常有JVM優化參數作用,參數調優的依據,常用的JVM分析工具能分析哪些問題以及使用方法.
- 執行模式 解釋/編譯/混合模式的優缺點,Java7提供的分層編譯技術,JIT即時編譯技術,OSR棧上替換,C1/C2編譯器針對的場景,C2針對的是server模式,優化更激進.新技術方面Java10的graal編譯器
- 編譯器優化javac的編譯過程,ast抽象語法樹,編譯器優化和運行器優化.
二、知識點詳解:
1、JVM內存模型:
線程獨佔:棧,本地方法棧,程序計數器
線程共享:堆,方法區
2、棧:
又稱方法棧,線程私有的,線程執行方法是都會創建一個棧陣,用來存儲局部變量表,操作棧,動態鏈接,方法
出口等信息.調用方法時執行入棧,方法返回式執行出棧.關注微信公眾:慕容千語獲取更多資源
3、本地方法棧
與棧類似,也是用來保存執行方法的信息.執行Java方法是使用棧,執行Native方法時使用本地方法棧.
4、程序計數器
保存著當前線程執行的字節碼位置,每個線程工作時都有獨立的計數器,只為執行Java方法服務,執行
Native方法時,程序計數器為空.
5、堆
JVM內存管理最大的一塊,對被線程共享,目的是存放對象的實例,幾乎所欲的對象實例都會放在這裡,當堆
沒有可用空間時,會拋出OOM異常.根據對象的存活週期不同,JVM把對象進行分代管理,由垃圾回收器進行
垃圾的回收管理
6、方法區:
又稱非堆區,用於存儲已被虛擬機加載的類信息,常量,靜態變量,即時編譯器優化後的代碼等數據.1.7的永
久代和1.8的元空間都是方法區的一種實現
7、JVM 內存可見性
JMM是定義程序中變量的訪問規則,線程對於變量的操作只能在自己的工作內存中進行,而不能直接對主
內存操作.由於指令重排序,讀寫的順序會被打亂,因此JMM需要提供原子性,可見性,有序性保證.
三、類加載與卸載
加載過程
其中驗證,準備,解析合稱鏈接
加載通過類的完全限定名,查找此類字節碼文件,利用字節碼文件創建Class對象.
驗證 確保Class文件符合當前虛擬機的要求,不會危害到虛擬機自身安全.
準備進行內存分配,為static修飾的類變量分配內存,並設置初始值(0或null).不包含fifinal修飾的靜態變量,
因為fifinal變量在編譯時分配.
解析將常量池中的符號引用替換為直接引用的過程.直接引用為直接指向目標的指針或者相對偏移量等.
初始化主要完成靜態塊執行以及靜態變量的賦值.先初始化父類,再初始化當前類.只有對類主動使用時才
會初始化.
觸發條件包括,創建類的實例時,訪問類的靜態方法或靜態變量的時候,使用Class.forName反射類的時候,
或者某個子類初始化的時候.
Java自帶的加載器加載的類,在虛擬機的生命週期中是不會被卸載的,只有用戶自定義的加載器加載的類
才可以被卸.
1、加載機制-雙親委派模式
雙親委派模式,即加載器加載類時先把請求委託給自己的父類加載器執行,直到頂層的啟動類加載器.父類
加載器能夠完成加載則成功返回,不能則子類加載器才自己嘗試加載.*
優點:
1. 避免類的重複加載
2. 避免Java的核心API被篡改
2、分代回收
分代回收基於兩個事實:大部分對象很快就不使用了,還有一部分不會立即無用,但也不會持續很長時間.
年輕代->標記-複製
老年代->標記-清除
3、回收算法
a、G1算法
1.9後默認的垃圾回收算法,特點保持高回收率的同時減少停頓.採用每次只清理一部分,而不是清理全部的
增量式清理,以保證停頓時間不會過長
其取消了年輕代與老年代的物理劃分,但仍屬於分代收集器,算法將堆分為若干個邏輯區域(region),一部分
用作年輕代,一部分用作老年代,還有用來存儲巨型對象的分區.
同CMS相同,會遍歷所有對象,標記引用情況,清除對象後會對區域進行復制移動,以整合碎片空間.
年輕代回收:
並行複製採用複製算法,並行收集,會StopTheWorld.
老年代回收:
會對年輕代一併回收
初始標記完成堆root對象的標記,會StopTheWorld.
併發標記 GC線程和應用線程併發執行.
最終標記完成三色標記週期,會StopTheWorld.
複製/清楚會優先對可回收空間加大的區域進行回收
b、ZGC算法
前面提供的高效垃圾回收算法,針對大堆內存設計,可以處理TB級別的堆,可以做到10ms以下的回收停頓
時間.
- 著色指針
- 讀屏障
- 併發處理
- 基於region
- 內存壓縮(整理)
roots標記:標記root對象,會StopTheWorld.
併發標記:利用讀屏障與應用線程一起運行標記,可能會發生StopTheWorld.
清除會清理標記為不可用的對象.
roots重定位:是對存活的對象進行移動,以騰出大塊內存空間,減少碎片產生.重定位最開始會
StopTheWorld,卻決於重定位集與對象總活動集的比例.
併發重定位與併發標記類似.
四、JVM的內存模型
未完待續......
點關注不迷路,下篇將講述JVM內存模型,堆和棧區別,JVM加載class文件的原理機制等
閱讀更多 JavaSpring高級進階 的文章