【java.lang.ref】当WeakReference的referent重写了finalize方法时会发生什么

当一个Java对象重写finalize方法并被WeakReference持有时,GC处理顺序不确定。可能先处理WeakReference导致finalize方法执行,也可能先执行finalize后再处理WeakReference。无论顺序,最终finalize方法会被调用,对象引用状态会变化。
摘要由CSDN通过智能技术生成

问题

question:当WeakReference的referent重写了finalize方法时会发生什么?

 


测试代码

JVM中是存在这样的情况的:一个Java对象,重写了finalize方法,在使用的过程中又被SoftReference或WeakReference或PhantomReference封装,这时候JVM是怎么处理该referent的?

软引用受LRU策略的影响,不太好探究。直接使用虚引用在JVM中的处理流程和弱引用一致,但还需要提供一个关系不大的ReferenceQueue,所以选择弱引用来探究这个问题,是更合适的。

用代码来描述这个问题:

public class ThisEscapeAndWeakRef {
    private static ThisEscapeAndWeakRef escape = null;

    @Override
    // finalize逃逸
    protected void finalize() throws Throwable {
    	ThisEscapeAndWeakRef.escape = this;
    	System.out.println("finalize method running");
    }

    // 用于测试finalize逃逸是否成功,如果成功escape != null,则可以调用该方法
    // 否则报空指针异常
    public void isAlive(String step) {
	    System.out.println(step + ": " + this
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值