一个关于JAVA GC的小实验

关于JAVA的GC,我只是略微了解,我知道如果一个对象没有其他东西引用它,它就会在适当的时机被回收掉。

但,如果一个A对象持有B对象的引用,后对A对象的引用被置为null,那么B对象还会被回收吗?如果B被回收,那么顺序是怎么样的?是A先,还是B先?

就让我们来实践一下:

创建两个类:

public class MyObject {

    private MyObject1 myObject1 = new MyObject1();

    @Override
    protected void finalize() throws Throwable {
        System.err.println("my object  gc");
    }
}
public class MyObject1 {

    @Override
    protected void finalize() throws Throwable {
        System.err.println("my object 1 gc");
    }
}

需要说明的是:finalize不一定会在对象被回收前被调用。

Main类:

public class Main {

    public static void main(String[] args) {
        MyObject myObject =new MyObject();
        myObject = null;

        System.gc();

        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}

需要说明的是:System.gc()只是建议虚拟机进行垃圾回收,但具体是由虚拟机自己去决定的,这里我使用的是Java HotSpot(TM) 64-Bit Server VM 18.9。

不同的虚拟机实现不同,可能会有不一样的结果。

好的,让我们来执行一下:

my object 1 gc
my object  gc

Process finished with exit code 0

首先是object1被回收,然后object才被回收。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值