JVM (Java Virtual Machine) 是運行 Java 字節碼的虛擬機器。Java 源碼編譯為 .class 字節碼,字節碼在 JVM 上運行。跨平台本質:不同操作系統有對應的 JVM 實現 (Windows/Linux/macOS/嵌入式),屏蔽了底層指令集、內存模型、系統調用差異,實現「一次編譯,到處運行」。
rt.jar/modules) + 啟動器。運行 Java 程序的最小環境。javac, javadoc, jdb, jconsole, jar 等)。開發、編譯、調試、打包的完整工具包。JDK 9+ 模組化後,
rt.jar拆分為jmods目錄下的模塊,JRE 也可通過jlink定制裁剪。
| 特性 | 核心含義 | Java 實現機制 |
|---|---|---|
| 封裝 | 隱藏內部細節,暴露公共接口 | private/protected/public 訪問修飾符、Getter/Setter |
| 繼承 | 子類復用父類代碼,建立 is-a 關係 | extends、super、方法重寫 @Override |
| 多態 | 同一接口不同實現,運行期動態綁定 | 向上轉型、動態分派 (invokevirtual)、接口多實現 |
| 抽象 | 提取共性忽略細節,定義契約 | abstract class、interface (JDK 8+ default/static/private 方法) |
不能。靜態方法屬於類,類加載時初始化;非靜態變量屬於實例,對象創建時才存在。靜態上下文無 this 引用,編譯器直接報錯 non-static variable cannot be referenced from a static context。
| 維度 | Override (重寫) | Overload (重載) |
|---|---|---|
| 發生位置 | 父子類/接口實現類 | 同一類內部 |
| 方法簽名 | 名稱、參數列表、返回類型 完全相同 | 名稱相同,參數列表 不同 (類型/個數/順序) |
| 返回類型 | 可协變 (子類類型) | 無要求 |
| 訪問權限 | 不能降低 (public > protected > default > private) | 無要求 |
| 拋出異常 | 不能拋出更寬泛的檢查型異常 | 無要求 |
| 綁定時機 | 運行期動態綁定 | 編譯期靜態綁定 |
類不支持多繼承 (單繼承),但 接口支持多實現 (implements A, B, C)。JDK 8+ 接口引入 default 方法後,間接實現了「行為多繼承」,鑽石問題由編譯器強制要求實現類顯式覆蓋衝突的 default 方法解決。
目的:自動識別並回收不可達對象佔用的堆內存,防止內存洩漏/OOM,提高開發效率。
觸發時機:
System.gc()、堆內存分配擔保失敗、CMS/G1 並發模式失敗退化。調用時機:GC 線程發現對象不可達且未覆寫 finalize() 或已調用過時,將對象放入 Finalizer 隊列,由低優先級 Finalizer 線程稍後調用。
作用:釋放非堆資源 (文件句柄、Socket、Native 內存、數據庫連接)。
缺陷:調用時間不確定、可能導致對象復活、拋出異常會中斷最終化、性能差。JDK 9 標記棄用,推薦 try-with-resources / AutoCloseable / Cleaner (JDK 9+)。
不會。置 null 僅切斷引用鏈,對象變為「不可達」,下一次 GC 掃描到該區域時才會回收。GC 運行由 JVM 根據內存壓力決定,不可人為強制 ( System.gc() 僅建議)。
-Xms -Xmx -Xmn -XX:MetaspaceSize)。