實例化是將類模板轉化為具體對象的過程。本文深入剖析 Java 對象創建、引用機制、內存佈局、垃圾回收等核心機制。
// 1. 聲明引用變量(棧幀局部變量表)
User user;
// 2. new 關鍵字觸發實例化
user = new User("Alice", 25);
// 3. JVM 執行步驟:
// a. 類加載檢查(符號引用解析為直接引用)
// b. 堆內存分配(指針碰撞/空閒列表 + TLAB)
// c. 零值初始化(字段默認值)
// d. 設置對象頭(哈希碼、GC 信息、鎖狀態、類元數據指針)
// e. 執行構造器(字段顯式初始化、代碼塊、構造器體)
// f. 返回引用賦值給變量
| 特性 | Java 引用 | C/C++ 指針 |
|---|---|---|
| 算術運算 | 不支持 | 支持 |
| 類型安全 | 強類型檢查 | 可強轉任意類型 |
| 內存地址暴露 | 不直接暴露 | 直接操作地址 |
| 賦值語義 | 傳遞句柄(共享對象) | 拷貝地址值 |
+------------------+ | Object Header | <- Mark Word (哈希/鎖/GC年齡) + Klass Pointer (類元數據) +------------------+ | Instance Data | <- 字段數據(按聲明順序/緊湊排列,父類字段在前) +------------------+ | Padding | <- 對齊填充(8字節倍數) +------------------+
System.gc() / Runtime.getRuntime().gc() 僅為建議,不保證執行
class Order {
User buyer; // 僅存儲引用(句柄),不複製 User 對象
List- items; // 引用集合對象
}
優勢:避免數據冗余、支撐共享引用、構建對象圖。注意:需防範循環引用導致內存洩漏(需弱引用或手動斷開)。