new 出來的物件實體、陣列。全執行緒共享,由 GC (垃圾回收器) 管理生命週期,分配較慢但靈活。方法執行:
String s = new String("Hello");
int len = s.length();
棧幀:
[s: ref] ──────┐
[len: 5] │
▼
堆:
+------------------+
| String Object |
| value: [H,e,l,l,o]|
| hash: 12345 |
+------------------+
void foo() {
int a = 10; // 基本型別直接在棧分配 4 bytes
Object obj = new Object(); // obj (參考) 在棧,new Object() 實體在堆
}
離開方法時,棧幀彈出,a、obj 參考銷毀。堆中物件若無其他參考指向,變為「垃圾」,等待 GC 回收。
new 在堆分配記憶體,回傳位址給棧上參考變數。| 區域 | 存放內容 | 共享性 | 備註 |
|---|---|---|---|
| 方法區 / Metaspace (JDK8+) | 類元資料、靜態變數、常量、即時編譯代碼 | 全域共享 | JDK8 移出堆,使用本地記憶體 |
| 執行緒私有棧 | 基本型區域變數、參考、幀資料 | 執行緒私有 | -Xss 設定大小 |
| 堆 | 物件實例、陣列 | 全域共享 | -Xms/-Xmx 設定,GC 主戰場 |
| 直接記憶體 | NIO DirectBuffer、JNI 本地分配 | 進程共享 | -XX:MaxDirectMemorySize 控制,不受堆限制但受限於物理記憶體 |
掌握「棧存參考/基本型、堆存物體、GC 管堆」這條主線,再理解物件頭結構、逃逸分析、分代收集,即可從根上解決記憶體洩漏、OOM、GC 停頓等疑難雜症。