Java 程序員必備基礎圖

前言

最近看了深入理解 Java 虛擬機第三版,整理了一些基礎結構圖,算是比較全的了,做一下筆記,大家一起學習。

1.Java 虛擬機運行時數據區圖

JVM 內存結構是 Java 程序員必須掌握的基礎。

程序計數器

Java 虛擬機棧

本地方法棧

Java 堆

方法區

2. 堆的默認分配圖

3. 方法區結構圖

方法區是各個線程共享的內存區域,它用於存儲已被虛擬機加載的類型信息、常量、靜態變量、即時編譯器編譯後的代碼緩存等數據。

4. 對象的內存佈局圖

一個 Java 對象在堆內存中包括對象頭、實例數據和補齊填充 3 個部分:

5. 對象頭的 Mark Word 圖

6. 對象與 Monitor 關聯結構圖

對象是如何跟 monitor 有關聯的呢?

一個 Java 對象在堆內存中包括對象頭,對象頭有 Mark word,Mark word 存儲着鎖狀態,鎖指針指向 monitor 地址。這其實是 Synchronized 的底層哦~

7.Java Monitor 的工作機理圖:

Java 線程同步底層就是監視鎖 Monitor~,如下是 Java Monitor 的工作機理圖:

8. 創建一個對象內存分配流程圖

9. 可達性分析算法判定對象存活

可達性分析算法是用來判斷一個對象是否存活的~

算法的核心思想:

10. 標記 - 清除算法示意圖

11. 標記 - 複製算法示意圖

12. 標記 - 整理算法示意圖

13. 垃圾收集器組合圖

14. 類的生命週期圖

一個類從被加載到虛擬機內存開始,到卸載出內存爲止,這個生命週期經歷了七個階段:加載、驗證、準備、解析、初始化、使用、卸載。

加載階段:

驗證:

準備

解析

初始化

15. 類加載器雙親委派模型圖

雙親委派模型構成

啓動類加載器,擴展類加載器,應用程序類加載器,自定義類加載器

雙親委派模型工作過程是

如果一個類加載器收到類加載的請求,它首先不會自己去嘗試加載這個類,而是把這個請求委派給父類加載器完成。每個類加載器都是如此,只有當父加載器在自己的搜索範圍內找不到指定的類時(即 ClassNotFoundException),子加載器纔會嘗試自己去加載。

爲什麼需要雙親委派模型?

如果沒有雙親委派,那麼用戶是不是可以自己定義一個 java.lang.Object 的同名類,java.lang.String 的同名類,並把它放到 ClassPath 中, 那麼類之間的比較結果及類的唯一性將無法保證,因此,雙親委派模型可以防止內存中出現多份同樣的字節碼。

16. 棧幀概念結構圖

棧幀是用於支持虛擬機進行方法調用和方法執行背後的數據結構。棧幀存儲了方法的局部變量表、操作數棧、動態連接和方法返回地址信息。

局部變量表

操作數棧

動態連接

方法返回地址

17.Java 內存模型圖

18. 線程狀態轉換關係圖

Java 語言定義了 6 種線程池狀態:

19. Class 文件格式圖

20.JVM 參數思維導圖

JVM 調優是通往高級開發的必經橋樑,所以好好積累 JVM 參數配置哈~

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/2Y-49p473OhZZpo3bllHGQ