JVM

Rooki3發表於2024-07-07

JVM

  1. JVM的位置

    作業系統的堆中,不能與硬體直接互動,需透過作業系統互動

  1. JVM體系結構

  2. 類載入器

    用於載入class檔案

    三種類載入器

    ​ 1.啟動類載入器Bootstarp ClassLoader

    ​ 2.擴充類載入器Extension ClassLoader

    ​ 3.應用程式類載入器Application ClassLoader

  3. 雙親委派機制

    1.類載入器收到類載入請求

    2.將這個請求委託個父類載入器,一直向上委託,直到啟動類(根類)載入器

    (Application ==> Extension ==> Bootstrap)

    3.類載入器檢查是否能載入當前類,能載入就結束,使用當前載入器,否則丟擲異常通知子類載入器

    4.重複操作3

    (Bootstrap ==> Extension ==> Application ==> ClassNotFound)

  4. 沙箱安全機制

    主要限制系統資源的訪問,引入域的概念,不同的域管理不同的系統資源許可權

    沙箱主要組成部件:

    ​ 1.位元組碼校驗器:確保java語言規範

    ​ 2.類裝載器:雙親委派機制,保護善意程式碼

    ​ 3.存取控制器:控制核心API對作業系統的存取許可權

    ​ 4.安全管理器

    ​ 5.安全軟體包:使用者自主增加安全特性,包括:

    ·安全提供者

    ·訊息摘要

    ·數字簽名

    ·加密

    ·鑑別

  5. Native關鍵字

    ·java無法執行,要呼叫底層的C語言庫

    ·進入本地方法棧,呼叫JNI(本地方法介面)

    ·記憶體區域中專門開闢了標記區域Native Method Stack,記錄native方法。

    ·JNI的作用:擴充java的使用,融合不同程式語言!

  6. PC暫存器

    相當於一個指標,儲存指令指向下一個指令的地址

    每個執行緒都有自己的程式計數器pc,執行緒私有的,生命週期和執行緒一致

  7. 方法區 Method Area

    被所有執行緒共享,是所有定義的方法的資訊都儲存在這個區域

    靜態變數static、常量final、類資訊(介面定義和構造方法)Class、常量池存在方法區,例項變數存在堆中

  8. 棧 Stack

    主管程式執行,生命週期和執行緒一致,不存在垃圾回收問題

    每個方法執行時都會建立一個棧幀

    儲存八大基本型別、引用物件和例項方法

    先進後出

  9. 三種JVM

    HotSpot-----sun公司

    JRockit-------BEA

    J9 VM--------IBM

  10. 堆 Heap

    一個JVM只有一個堆,堆記憶體大小是可調節的

    類載入器讀取完類檔案後,堆中存放所有應用型別的真實物件,類,方法,常量,變數

    堆記憶體可分為三個區域:

    ​ 新生區(伊甸園Eden Space、倖存區Survivor Space):

    ​ 伊甸園Eden Space:物件被建立首先被放置的區域,進行輕量級的垃圾回收後未被清理的物件會進入倖存區Survivor Space。

    ​ 倖存區Survivor Space:有兩個,To Survivor Space和From Survivor Space,大小一致,用於儲存在eden space記憶體區域中經過垃圾回收後沒有被回收的物件。

    執行垃圾回收的時候Eden區域不能被回收的物件被放入到空的survivor(也就是To Survivor,同時Eden區域的記憶體會在垃圾回收的過程中全部釋放),另一個survivor(即From Survivor)裡不能被回收的物件也會被放入這個survivor(即To Survivor),然後To Survivor 和 From Survivor的標記會互換,始終保證一個survivor是空的。 Mintor GC/Young GC

    ​ 老年區

    ​ 用於於存放新生區中經過多次垃圾回收仍然存活的物件,也有可能是新生區分配不了記憶體的大物件會直接進入老年區。Major GC/Full GC

    ​ 永久區

    ​ 存放JDK自帶的Class物件,Interface後設資料,關閉JVM就會釋放記憶體

  11. 堆記憶體調優

    OOM: java.lang.OutOfMemoryError: Java heap space

    嘗試擴大堆記憶體,透過JProffiler工具分析OOM原因

    -Xms:設定jvm初始化大小

    -Xmx:設定jvm最大記憶體大小

    -Xmn:設定新生區大小

    -Xss:設定每個執行緒堆疊大小

    -XX:+PrintGCDetails //列印GC垃圾回收資訊

    -XX:+HeapDumpOnOutOfMemoryError //OOM Dump

  12. GC

    作用區域:方法區和堆

    ​ 常用演算法

    ​ 引用計數法:給每個物件分配一個計數器,記錄使用次數

    ​ 複製演算法:年輕代中的倖存區

    ​ 好處:沒有記憶體碎片

    ​ 壞處:浪費了記憶體空間

    ​ 最佳使用環境:物件存活度低

    ​ 標記清除:對活著的物件進行標記,再對未標記的物件進行刪除

    ​ 優點:不需要額外空間

    ​ 缺點:浪費時間,會引數記憶體碎片

    ​ 標記壓縮::標記清除後,向一段移動存活的物件

    GC分代收集演算法:新生代用複製演算法,老年代用標記清除壓縮

  13. JMM (Java Memory Modal------java記憶體模型)

一種跨平臺開發規範

三大特效:原子性、可見性、有序性

相關文章