java垃圾收集和空引用
在我为OCJP学习的过程中,我遇到了以下问题:java垃圾收集和空引用,java,garbage-collection,scjp,Java,Garbage Collection,Scjp,在我为OCJP学习的过程中,我遇到了以下问题: class CardBoard { Short story = 200; CardBoard go(CardBoard cb) { cb = null; return cb; } public static void main(String[] args) { CardBo
class CardBoard {
Short story = 200;
CardBoard go(CardBoard cb) {
cb = null;
return cb;
}
public static void main(String[] args) {
CardBoard c1 = new CardBoard();
CardBoard c2 = new CardBoard();
CardBoard c3 = c1.go(c2);
c1 = null;
// do Stuff
}}
达到//doStuff时,有多少对象符合GC条件?正确答案是2,表示
c1
及其story
对象
当到达行//doStuff时,c3也为空。为什么它也不符合GC条件?
c3
不是对象。它是一个引用null的变量。变量不能用于GC。只有对象才有资格使用GC
符合GC条件的对象是最初由
c1
引用的硬纸板,而最初由c1
引用的硬纸板引用的短实例是带有空引用的本地句柄,它不指向(并且hever已指向)分配的对象。因此GC没有什么问题。垃圾收集器扫描内存中的对象,当它找到一个对象时,会检查指向它的句柄(而不是相反)
当调用垃圾收集器时,没有指向它们的句柄的对象(内存内)将从内存中删除。在这种情况下,代码中只创建了两个对象,但有三个句柄。垃圾收集器最多只删除2个对象(因为只有两个对象存在),C3只指向空位置。C1、C2、C3未拆下。它们用来指向的对象将被删除(以防没有其他控制柄指向它们)。因此,在这一点上,因为C3从未指向内存中的对象,所以将其设置为null对垃圾收集器没有影响
希望我是有帮助的你的硬纸板#go()
方法没有任何作用。它接收对某个对象的引用,立即将其忘记,替换为null
,并返回该null
值
那么,线路呢
CardBoard c3 = c1.go(c2);
也不执行任何操作,即不创建任何对象。仅将null分配给c3
。所以它不是垃圾收集的,因为它已经不存在了 c3本身只是一个引用变量,不在堆空间中(即不在垃圾收集范围内)
行c3=c1.go(c2)代码>仅将c3引用设置为空
因此c3不会影响垃圾收集,因为它不会使任何对象符合条件 c3没有对对象的引用,这只是为了制造一些混乱
我们已经创建了两个对象c1和c2,我们缺少的是Short类型的包装器对象,所以基本上我们总共创建了四个对象
当我们使c1=null时,这意味着我们正在使用c1访问的短对象可用于GC,而不是我们可以使用c2访问的短对象
这可以使用以下代码进行验证:
公营纸板{
Short story = 200;
CardBoard go(CardBoard cb) {
cb = null;
return cb;
}
public static void main(String[] args) {
Runtime run = Runtime.getRuntime();
CardBoard c1 = new CardBoard();
CardBoard c2 = new CardBoard();
CardBoard c3 = c1.go(c2);
// System.out.println(run.freeMemory());
run.gc();
// System.out.println(run.freeMemory());
c1.story = 100;
System.out.println(c1.story);
c1 = null;
run.gc();
System.out.println(c2.story);
}
}
输出:
100
二百
这意味着我们可以从c1访问的c1和Short story可用于垃圾收集,而不是c2的Short story。因为它从未被赋值:)。它从一开始就是空的。