JVM-Java工程師必須掌握的知識點
java老頑童發表於2019-01-17
JVM
1、JVM基本概念
:JVM是可執行Java程式碼的假想計算機 ,包括一套位元組碼指令集、一組暫存器、一個棧、一個垃圾回收,堆 和 一個儲存方法域。JVM是執行在作業系統之上的,它與硬體沒有直接的互動。
2、記憶體模型
方法區
----儲存類資訊、靜態變數
虛擬機器棧
----執行緒私有
本地方法棧
----本地方法變數儲存區
堆
----物件儲存區
程式計數器
----控制程式執行順序
3、堆
新生代
----Eden區、S0、S1
老年代
----大物件和S0、s1轉移的物件
持久代
----是方法區的實現,主要存放所有已載入的類資訊,方法資訊,常量池
Tips
:面試官如果問這個數字,必須答出來。新生代佔比:6:1:1,新生代和老年代比例為1:3
4、GC
標記垃圾演算法
:
引用計數法
----淘汰,原因是會出現相互依賴問題
可達性演算法
----GC樹
Root節點
:棧幀本地變數表引用物件、本地方法引用物件、方法區常量引用物件、方法區靜態變數引用的物件(詞語是不是很模糊,LZ也很模糊)
回收演算法
標記-清除
----每個物件如果標記清除,GC時會被回收,缺點在於記憶體碎片較多,產生後果就是浪費空間
標記-整理
----把標記的物件轉移到另一塊一樣的,空間換時間
分代回收
----根據不同區域特點設定不同策略回收,新生代採取標記整理,老年代採取標記清除
Tips
:面試官如果問為什麼Java採取這個分而治之演算法呢?可以這樣回答:新生代轉成老年代物件很快,記憶體空間較少,GC頻率較多,所以在新生代有分割槽概念;而老年代物件基本不會動,GC機率較少,且都是大物件,用標記整理最合適。這樣使整體GC效率提高
5、類載入
流程
- 類載入
- 類連線
- 類初始化
- ...
類載入器
Bootstrap載入器
----lib\rt.jar 包含了很多Jdk原有的類class檔案
Extension載入器
----lib\ext*.jar
App類載入器
----classpath
自定義載入器
----自定義載入類
雙親委派模式載入
- 主要是為了校驗,不讓程式設計者破壞jre執行環境
- 運用自定義類載入器可以實現熱部署. Java伺服器熱部署的實現原理