首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 垃圾回收機制:物件何時符合回收條件?

     編輯:程式設計綜合問答

程式碼情境


1. Object aobj = new Object();
2. Object bobj = new Object();
3. Object cobj = new Object();
4. aobj = bobj;
5. aobj = cobj;
6. cobj = null;
7. aobj = null;

問題:第幾行建立的物件符合 GC 回收條件?

引用關係圖解

行號操作堆中物件狀態可達性分析
1`aobj` → ObjAObjA: 被 aobj 參考可達
2`bobj` → ObjBObjB: 被 bobj 參考可達
3`cobj` → ObjCObjC: 被 cobj 參考可達
4`aobj = bobj`**ObjA 失去最後參考** → **不可達**
ObjB: 被 aobj、bobj 雙重參考
**ObjA 符合回收**
5`aobj = cobj`ObjB: 僅被 bobj 參考
ObjC: 被 aobj、cobj 雙重參考
ObjA 已不可達
6`cobj = null`ObjC: 僅被 aobj 參考ObjC 仍可達 (經 aobj)
7`aobj = null`**ObjC 失去最後參考** → **不可達**
ObjB: 仍被 bobj 參考
**ObjC 符合回收**

答案

  • 第 4 行執行後,`new Object()` (ObjA) 失去所有引用,**最早符合回收條件**。
  • 第 7 行執行後,`new Object()` (ObjC) 失去所有引用,**符合回收條件**。
  • ObjB (第 2 行) 一直被 `bobj` 參考,方法結束前**不符合回收**。

GC 核心判斷標準:可達性分析

**「一個物件是否存活,取決於它是否可從 GC Roots 經由引用鏈到達。」**

GC Roots 包含:

  • 虛擬機棧區引用的物件 (區域變數表)。
  • 方法區靜態屬性/常數引用的物件。
  • 本地方法棧 JNI 引用的物件。

若物件到 GC Roots 沒有任何引用鏈相連,**即為不可達**,標記為可回收 (經過兩次標記:第一次標記不可達,第二次在 Finalizer 佇列確認無復活才真正回收)。

補充:引用類型影響回收時機

引用類型回收行為用途
強引用永不回收 (寧願 OOM)普遍物件 `Object obj = new Object()`
軟引用記憶體不足前回收快取
弱引用下次 GC 必回收快取、監聽器
虛引用不影響生命週期,回收前收到通知直接記憶體管理

結論

範例中 **ObjA (第 1 行建立) 在第 4 行失去引用** 最早可被回收;**ObjC (第 3 行建立) 在第 7 行失去引用** 可被回收。GC 依據**可達性分析**而非單純「不引用就回收」(需經過標記-清除/整理/複製等演算法),且受引用類型影響。理解引用鏈與 GC Roots 是診斷記憶體洩漏的基礎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved