一种可能的解决方案是依赖java.lang.ref
包,它只支持与垃圾收集器进行有限程度的交互。
测量结果不可能准确,因为很难知道一个物体的真实结局。我相信 Joshua 必须有另一种测量时间的方法,也许是 JVM 本身。
PhantomReference
最接近对象生命周期结束的引用。换句话说,对象是幻影可达的。
public class WithoutFinalizationV1 {
public static void main(String[] args) {
ReferenceQueue<WithoutFinalizationV1> queue = new ReferenceQueue<>();
long start = System.nanoTime();
PhantomReference<WithoutFinalizationV1> rf = new PhantomReference<>(
new WithoutFinalizationV1(), queue);
System.gc(); //advise JVM to do GC
Object x = null;
int waitCount = -1;
do{
x = queue.poll();
waitCount++;
} while(x == null);
//only need this time point
System.out.println("WithoutV1 "+ waitCount + " " + (System.nanoTime() - start));
}
}
跑了几次,世界纪录是5394860ns,与5.6ns相差甚远。
添加后
@Override
protected void finalize() throws Throwable {
}
结果是 5632208ns。
这是我写的相关帖子的摘录。