1. 程式人生 > 實用技巧 >JVM規範與架構

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的路徑