作者adrianshum (Alien)
看板java
标题Re: [问题] 关於GC的问题...
时间Tue Oct 16 10:21:26 2007
※ 引述《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
1F:推 lion1116:呃...是说eligble for GC这个没错...应该把原文加上去= = 10/16 10:59