问题
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