推 lion1116:呃...是說eligble for GC這個沒錯...應該把原文加上去= = 10/16 10:59
※ 引述《lion1116 (...)》之銘言:
: 01. public Object m(){
: 02. Object o = new Float(3.14f);
: 03. Object[] oa = new Object[1];
: 04. oa[0] = o;
: 05. o = null;
: 06. return oa[0];
: 07. }
: 在上面這段程式中,題目是問在02.所產生的物件何時被回收,
: 答案是說在05.被回收。
: 而下面是小弟按照書上的觀念畫的圖,
: 從書上寫的關於gc的部份,是說將不使用的記憶體回收,
: o 所指向的記憶體,雖然 o 在05.變成了 null,
: 但是在04.時 oa[0] 不也指向了相同的記憶體位址嗎?
: 那這樣不就只有03.所產生的記憶體被回收了?
: 關於gc的觀念有點混亂...煩請各位先進指引一下...@@
: =====================================
: ┌─┐ ┌────────┐
: 02. │o │→│new Float(3.14f)│
: └─┘ └────────┘
: =====================================
: ┌─┐ ┌───────┐
: 03. │oa│→│new Object[1] │
: └─┘ └───────┘
: =====================================
: ┌─┐ ┌────────┐
: 04. │o │→│new Float(3.14f)│
: └─┘ └────────┘
: ┌─┐↗ ┌───────┐
: │oa│ │new Object[1] │→ GC
: └─┘ └───────┘
: =====================================
: ┌─┐
: 05. │o │→ null
: └─┘
: ┌─┐ ┌────────┐
: │oa│→│new Float(3.14f)│
: └─┘ └────────┘
: =====================================
首先如推文所說, 你是不知道何時被回收的.
但如果你問是 "何時會 eligible for GC"
的話, 你的答案是大玫正確的. 從這文章
片段時看不到何時 eligble for GC 的
另有一點小錯漏,但不影響答案
oa 是 Object Array, 所以當 oa[0] 指向o
時, 是 oa 指向的 array 的第1個 element
指向 o
即是:
┌─┐ ┌ ┐
03. │oa│→│↑│
└─┘ └─┘
=====================================
┌─┐ ┌────────┐
04. │o │→│new Float(3.14f)│
└─┘ └────────┘
↑
┌─┐ ┌│┐
│oa│→│││
└─┘ └─┘
=====================================
┌─┐
05. │o │→ null
└─┘
┌────────┐
│new Float(3.14f)│
└────────┘
↑
┌─┐ ┌│┐
│oa│→│││
└─┘ └─┘
=====================================
所以 oa 指著的 Object[] 一直都在, 沒有被回收
alien
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 202.22.246.26