JVM規範與架構
JVM
一、什麼是JVM
-
JVM (Java virtual machine) 是一個虛構出來的計算機
-
JVM虛擬出一套硬體架構,如處理器、堆、棧等和對應的指令系統
-
Java語言最重要的特點就是跨平臺執行,使用JVM就是為了支援與作業系統無關,實現跨平臺。
二、JVM如何實現平臺無關
三、JVM架構圖
四、JVM規範
- Java語言與JVM相對獨立
- 只要語言能編譯成為符合JVM標準的位元組碼,就能在JVM上執行
- JVM規範主要規定class檔案格式、JVM指令集、數值內部表達方式等
- JVM 檔案格式為Class
- 資料型別包括基礎型別與引用型別
- 執行時資料區:
- PC暫存器 、Java虛擬機器棧、本地方法棧
- Java堆、方法區、執行時常量池
- 特殊方法:物件的初始化構造
- 位元組碼指令集
- 類庫
- 反射、ClassLoader、安全、多執行緒、弱引用
五、JVM規範指令集
-
JVM指令又稱為位元組碼指令
-
由一個byte的操作碼(opcode)跟上0個到多個運算元構成。
-
除去保留指令 54條,JVM的有效指令一共 202條,可以分為 10個大類
六、JVM啟動流程
七、JVM架構執行時資料區構成
1、PC暫存器
-
每個執行緒擁有獨立的PC暫存器
-
線上程建立時建立
-
指向下一條指令的地址
-
執行本地方法時,PC的值為undefined
2、方法區
-
儲存裝載的類資訊
-
型別、常量、靜態變數、JIT編譯後的程式碼快取等
-
Hotpot中,在java7之前方法區也叫永久代 Perm
-
Java6 型別的常量池還在方法區,Java7之後轉移到堆中
3、Java堆
-
和程式開發密切相關
-
“幾乎”所有的物件例項都在堆中
-
所有執行緒共享Java堆
-
在HotSpot中,堆是分代的
-
是GC的主要工作區間
新生代 Young Generation:又分為 Eden 、Survior(From 、To)
老年代 Old Generation
在Java9之後的預設GC G1中,仍然沿用了年輕代和老年代
4、Java棧
-
執行緒私有
-
棧由一系列幀組成
-
幀儲存一個方法的區域性變數、運算元棧、動態連結、返回地址
-
每一次方法呼叫建立一個幀,並壓棧
八、JVM基本機構 堆、棧、方法區互動
九、JVM基本結構 解釋執行與編譯執行
- 解釋執行:
- 解釋執行以解釋方式執行位元組碼
- 解釋執行的意思是:讀一句執行一句
- 編譯執行(JIT)
- 將位元組碼編譯成機器碼
- 直接執行機器碼
- 執行時編譯
- 編譯後效能有數量級的提升
十、JVM常用引數
Trace跟蹤引數 堆的分配引數 棧的分配引數
1、Trace跟蹤引數
-XX:+PrintGC java9之後 -Xlog:gc 可以列印GC的簡要資訊
-XX:+PrintGCDetails java9之後 -Xlog:gc 列印GC詳細資訊
-
例
PSYoungGen total 2560K, used 102K [0x00000007bf980000, 0x00000007bfc80000, 0x00000007c0000000)
eden space 2048K, 5% used [0x00000007bf980000,0x00000007bf9999d8,0x00000007bfb80000)
from space 512K, 0% used [0x00000007bfc00000,0x00000007bfc00000,0x00000007bfc80000)
to space 512K, 0% used [0x00000007bfb80000,0x00000007bfb80000,0x00000007bfc00000)
ParOldGen total 8704K, used 4502K [0x00000007bec00000, 0x00000007bf480000, 0x00000007bf980000)
object space 8704K, 51% used [0x00000007bec00000,0x00000007bf065880,0x00000007bf480000)
Metaspace used 3102K, capacity 4500K, committed 4864K, reserved 1056768K
class space used 338K, capacity 388K, committed 512K, reserved 1048576K
-XX:+TraceClassLoading (java9 -Xlog:class+load=info ) 監控類的載入
2、堆分配引數
-Xmx –Xms 指定最大堆和最小堆
-Xmn 設定新生代大小
-XX:NewRatio 新生代(eden+2*survivor)和老年代的比值
4: 表示 新生代:老年代=1:4
-XX:SurvivorRatio 設定Survivor區和Eden區的比例
8:表示 Eden:Survivor= 8:1,由於有兩個survivor區,即Eden佔到新生代的80%,
一個Survivor佔年輕代的1/10
-XX:+HeapDumpOnOutOfMemoryError OOM時匯出堆到檔案
8:表示 ** Eden:Survivor**= 8:1,由於有兩個survivor區,即Eden佔到新生代的80%,
一個Survivor佔年輕代的1/10
-XX:+HeapDumpOnOutOfMemoryError OOM時匯出堆到檔案
-XX:+HeapDumpPath 匯出OOM的路徑