Eri*_*ves 5 java garbage-collection
我正在研究Java认证1Z0-803,我对垃圾收集存在疑问:
import java.util.*;
class X {
List<String> list = new ArrayList<>();
}
public class TestGC {
// Is an Object eligible for GC even if its instance variable is references to another variable
public static void main(String[] args){
X x = new X(); // 1
List<String> list = x.list;
x = null; // 2, Is X object reference eligible for garbage collection here?
list.add("a");
list.add("b");
list.add("c");
for(String item : list) {
System.out.println(item);
}
list = null;// 3, Or X object reference eligible for garbage collection here, after list is set to null
}
}
Run Code Online (Sandbox Code Playgroud)
x引用X在位置1处创建的对象.
此类X具有该类型的实例变量List.
如果我在局部变量list中的类型的x上引用了实例变量,然后设置为null,则引用的对象将符合此行中的GC条件(位置2),或者因为我引用了此对象的实例变量,当该对象的实例变量没有任何引用(位置3)时,该对象仅适用于GC?Xlistxx
最初,你有
stack --> x --> list
Run Code Online (Sandbox Code Playgroud)
因此,x可以从堆栈到达.
那你有
stack --> x --> list
\ /
\--------/
Run Code Online (Sandbox Code Playgroud)
x仍然可以从堆栈到达,并且列表也可以通过x和堆栈上的局部变量到达
然后你将x设置为null,所以你有
stack x --> list
\ /
\--------/
Run Code Online (Sandbox Code Playgroud)
而且你因此看到现在有了从堆栈到达x的方法.存在从x到列表的路径的事实是无关紧要的.因此允许VM收集x:
stack list
\ /
\--------/
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
207 次 |
| 最近记录: |