1. 編譯與運行流程
.java → (編譯器) → .class → (類加載器) → 方法區 → (執行引擎) → 運行
- 一個 .java 含多少類,編譯產出多少 .class(內部類不計)。
- 一個 .class 僅包含一個類或接口。
2. 底層訪問雙通道
- 標準路徑:Java API → 本地方法 → 底層系統(跨平台)。
- 捷徑:直接調用本地方法(平台相關,JNI)。
3. 雙親委派類加載器體系
- 啟動類加載器:唯一、C++ 實現、虛擬機一部分、加載核心庫(rt.jar)。
- 用戶自定義加載器:Java 實現、可多實例、屬應用程序一部分。
委派機制
- 請求向上委派至啟動加載器。
- 父加載器無法加載則下推給子加載器。
- 每個加載器維護獨立命名空間,同一命名空間類可互訪,隔離不同空間。
4. JVM 生命週期
每個 Java 程序擁有獨立 JVM 實例,隨程序啟動/退出而生滅。
5. 運行時內存區域劃分
| 區域 | 核心職責 | 線程共享性 |
| 方法區 | 類元數據、常量池、靜態變量、方法字節碼 | 共享 |
| 堆 | 對象實例、數組、實例變量 | 共享 |
| Java 棧 | 棧幀(局部變量、操作數棧、幀數據區)、方法調用狀態 | 私有 |
| 本地方法棧 | Native 方法調用狀態(如 C 棧) | 私有 |
棧幀結構
- 局部變量表:字長數組,索引訪問。非靜態方法隱含
this 參數(索引 0)。
- 操作數棧:棧式操作,指令執行工作區(如
iadd 彈出相加壓入結果)。
- 幀數據區:常量池解析、異常處理、返回地址。
6. Java 數據類型體系
- 基本類型:
byte/short/int/long/char/float/double/boolean(int/char 可互換)。
- 引用類型:類、接口、數組。
7. 引用 vs 指針
- 引用:對象代表,無內存佔用、不可修改、可為
null。
- 指針:存儲地址的變量,可修改、佔用內存。
8. 方法區線程安全
共享前提下,每個類被設置為臨界資源,同一時刻僅允許單線程訪問。
9. 類唯一標識
類全限定名 + 定義該類的加載器實例 = 唯一標識(同一類可被不同加載器加載至不同命名空間)。
10. 對象模型與動態綁定
- 實例變量在堆,符號引用在常量池/方法表。
- 調用方法需動態綁定:根據對象實際類型(而非引用類型)在運行時確定方法版本。