作者s3748679 (冷羽翼尘)
看板java
标题Re: [问题] null 和 GC 与 LinkedList 的原始码
时间Fri Oct 21 00:44:40 2011
..原文恕删
感谢jtmh的回答,在这边我原文可能没有表达好,这次重新修改成例子+描述下好了~
(重申一下.. LinkedList.java:
http://pastie.org/2730219 ,
很抱歉我原文没有Po出来~)
假设整个结构长这样,而element这栏位是否会被GC回收先忽略掉: (size = 3)
注: _Instance1 2 3 是方便用的,实际没有这变数。
header←═════════════════════════╗
┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐║
│ element │ │ element │ │ element │ │ element │║
│┌───┐│ │┌───┐│ │┌───┐│ │┌───┐│║
││ ││ ││ ││ ││ ││ ││ ││║
│└───┘│ │└───┘│ │└───┘│ │└───┘│║
│ │ │ │ │ │ │ │║
│ next │ │ next │ │ next │ │ next │║
│┌───┐│ │┌───┐│ │┌───┐│ │┌───┐│║
││ ╪╪→││ ╪╪→││ ╪╪→││ ╪╪╝
│└───┘│ │└───┘│ │└───┘│ │└───┘│
│ │ │ │ │ │ │ │
│ previous │ │ previous │ │ previous │ │ previous │
│┌───┐│ │┌───┐│ │┌───┐│ │┌───┐│
╔╪╪ ││←╪╪ ││←╪╪ ││←╪╪ ││
║│└───┘│ │└───┘│ │└───┘│ │└───┘│
║└─────┘ └─────┘ └─────┘ └─────┘
║ _Instance1 _Instance2 _Instance3
║ ↑
╚═══════════════════════════╝
图一、未remove前的状态
假设现在的remove改成了remove_x,换句话说就是这样:
private E remove_x(Entry<E> e) {
if (e == header)
throw new NoSuchElementException();
E result = e.element;
e.previous.next = e.next;
e.next.previous = e.previous;
size--;
modCount++;
return result;
}
那麽倘若执行了以下叙述:
remove_x(_Instance1);
那麽整个结构就会转成这副德性:
╔═══════════════════════════╗
↓ ╔═══════════╗ ║
header ║ ↓ ║
┌─────┐║┌─────┐ ┌─────┐ ┌─────┐║
│ element │║│ element │ │ element │ │ element │║
│┌───┐│║│┌───┐│ │┌───┐│ │┌───┐│║
││ ││║││ ││ ││ ││ ││ ││║
│└───┘│║│└───┘│ │└───┘│ │└───┘│║
│ │║│ │ │ │ │ │║
│ next │║│ next │ │ next │ │ next │║
│┌───┐│║│┌───┐│ │┌───┐│ │┌───┐│║
││ ╪╪╝││ ╪╪→││ ╪╪→││ ╪╪╝
│└───┘│ │└───┘│ │└───┘│ │└───┘│
│ │ │ │ │ │ │ │
│ previous │ │ previous │ │ previous │ │ previous │
│┌───┐│ │┌───┐│ │┌───┐│ │┌───┐│
╔╪╪ ││←╪╪ ││╔╪╪ ││←╪╪ ││
║│└───┘│ │└───┘│║│└───┘│ │└───┘│
║└─────┘ └─────┘║└─────┘ └─────┘
║ ↑ _Instance1 ║ _Instance2 _Instance3
║ ╚═══════════╝ ↑
╚═══════════════════════════╝
图二、remove_x(_Instance1)後的状态
而现在假设GC还没把_Instance1这个东西吃掉而继续执行下面的叙述:
remove_x(_Instance2);
那麽整个结构接着会转成这副德性:
╔═══════════════════════════╗
↓ ╔═══════════════════╗ ║
header ║ ↓ ║
┌─────┐║┌─────┐ ┌─────┐ ┌─────┐║
│ element │║│ element │ │ element │ │ element │║
│┌───┐│║│┌───┐│ │┌───┐│ │┌───┐│║
││ ││║││ ││ ││ ││ ││ ││║
│└───┘│║│└───┘│ │└───┘│ │└───┘│║
│ │║│ │ │ │ │ │║
│ next │║│ next │ │ next │ │ next │║
│┌───┐│║│┌───┐│ │┌───┐│ │┌───┐│║
││ ╪╪╝││ ╪╪→││ ╪╪→││ ╪╪╝
│└───┘│ │└───┘│ │└───┘│ │└───┘│
│ │ │ │ │ │ │ │
│ previous │ │ previous │ │ previous │ │ previous │
│┌───┐│ │┌───┐│ │┌───┐│ │┌───┐│
╔╪╪ ││←╪╪ ││╔╪╪ ││╔╪╪ ││
║│└───┘│ │└───┘│║│└───┘│║│└───┘│
║└─────┘ └─────┘║└─────┘║└─────┘
║ ↑↑ _Instance1 ║ _Instance2 ║ _Instance3
║ ║╚═══════════╝ ║ ↑
║ ╚════════════════════╝ ║
╚═══════════════════════════╝
图三、续图二後remove_x(_Instance2)後的状态
而现在重点来了~
既定事实: (根据上几篇看後的推测)
如果现在GC抓_Instance1,是可以回收的!
另一方面,现在GC抓_Instance2,是不可以回收的(因为被_Instance1参照)!
理论上 LinkedList是存取不到 _Instance1和_Instance2。
以及如果GC回收_Instance1,那麽_Instance2也就变得可以回收,
但若倒过来(先回收_Instance2再回收_Instance1)则不行。
问题:
1. 在remove_x二个_Instance後,GC是否还能够把这二个_Instance回收掉。
2. 如果GC能够回收掉,那麽写null的意义为何? 不会是能让GC更快回收吧?
3. 如果GC不能够回收掉,那麽写这null就很必要的了? (好灰暗啊...)
PS: 仍旧老话那句,对於半路出家的我,希望各位能够指点迷津~~~ =ˇ=
...用记事本编辑好久 orz
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.164.77.96