我以为WeakReference引用对象将在System.gc()调用后完成,但是我错了。
这里有两个测试用例,唯一的区别是WeakReference构造函数,第一个是新对象,而第二个使用引用,并且它们具有不同的性能,我不知道为什么...
- 弱引用对象,不会阻止其引用对象成为对象
- 已定型,定型然后回收。参考文献最弱
- 通常用于实现规范化映射。*
假设垃圾收集器在某个时间点确定
- 物体弱弱
- 可达。到那时,它将自动清除所有对
的弱引用- 该对象和对所有其他弱可达对象的所有弱引用
- 通过坚固和柔软的链从该物体可以到达
- 参考。同时它将声明所有以前的
- 弱可达对象要完成。同时或在某些时候
- 稍后它将排队那些新近清除的弱引用是>
- 在参考队列中注册。
package com.zeng.javaReference; import org.junit.Test; import java.lang.ref.WeakReference; /** * @author zeng * @version 1.0.0 * @date 2020-05-11 */ public class WeakReferenceTest { @Test public void weakRefRemoved() { WeakReference<Apple> weakReference = new WeakReference<>(new Apple("green-apple")); System.gc(); if (weakReference.get() == null) { System.out.println("GC remove weakReference!"); } else { System.out.println("weakReference still alive"); } } @Test public void weakRefNotRemoved() { Apple apple = new Apple("green-apple"); WeakReference<Apple> weakReference = new WeakReference<>(apple); System.gc(); if (weakReference.get() == null) { System.out.println("GC remove weakReference!"); } else { System.out.println("weakReference still alive"); } } public static class Apple { private String name; public Apple(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override protected void finalize() throws Throwable { super.finalize(); System.out.println("Apple: " + name + " finalized。"); } @Override public String toString() { return "Apple{" + "name='" + name + '\'' + '}' + ", hashCode:" + this.hashCode(); } } }
我以为WeakReference引用对象将在System.gc()调用后完成,但是我错了。这是两个测试用例,唯一的区别是WeakReference构造函数,第一个是新对象...
[System.gc()
可能会或可能不会触发垃圾回收。