看板 java 關於我們 聯絡資訊
※ 引述《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
lion1116:呃...是說eligble for GC這個沒錯...應該把原文加上去= = 10/16 10:59