執行 java 命令啟動一個 JVM 進程。同一 JVM 內所有執行緒、變數共享進程記憶體區。JVM 終止條件:
System.exit() 或 Runtime.getRuntime().exit()JVM 終止意味著堆內存資料全部釋放。
當程式主動使用某類且該類尚未載入記憶體時,觸發類加載。類加載將 .class 位元碼讀入記憶體,並在方法區建立 java.lang.Class 實例 —— 類本身也是物件。
類加載三階段:
<clinit> 方法 (靜態變數賦值、靜態區塊)| 加載器 | 父加載器 | 載入範圍 |
|---|---|---|
| Bootstrap ClassLoader | 無 (C++ 實現) | JAVA_HOME/lib/rt.jar 等核心庫 |
| Extension ClassLoader | Bootstrap | JAVA_HOME/lib/ext/*.jar |
| Application ClassLoader | Extension | Classpath 指定的類 (使用者代碼) |
| 自定義 ClassLoader | Application | 使用者定義來源 (網路、加密檔、資料庫等) |
雙親委派模型:子加載器收到請求先委派父加載器,父無法載入時子才嘗試。目的:避免核心類被竄改、確保類載入唯一性。
反射是在執行期動態獲取類資訊、建立實例、呼叫方法/存取屬性的能力。核心 API:
Class.forName("full.class.Name"):獲取 Class 物件 (觸發初始化)clazz.newInstance() / constructor.newInstance(args):建立實例method.invoke(obj, args):呼叫方法field.get(obj) / field.set(obj, val):存取屬性 (需 setAccessible(true) 破壞封裝)setAccessible(true) 可能被 SecurityManager 禁止--add-opens 開放封裝