java垃圾收集和空引用

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

在我为OCJP学习的过程中,我遇到了以下问题:

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。

因为它从未被赋值:)。它从一开始就是空的。