Java引用分为四种类型:强软弱虚
1 强引用,我们平时用的引用,被它指向的对象,一定会被可达性分析搜索到,gc阶段会幸存下来
2 软引用,地位稍低于强引用,一般用于缓存,内存不足时才会被回收。软引用是用包装的方法实现的,也就是一个强引用指向一个SoftReference对象,这个对象再指向真的对象
import java.lang.ref.SoftReference;
public class SoftReferenceExample {
public static void main(String[] args) {
// 创建一个字符串对象,加上软引用
SoftReference<String> softRef = new SoftReference<String>(new String("Hello World"));
// 尝试获取软引用所引用的对象,如果对象未被回收,则输出该对象的内容
if (softRef.get() != null) {
System.out.println("SoftReference: " + softRef.get());
}
// 手动触发垃圾回收
System.gc();
// 再次尝试获取软引用所引用的对象,如果对象被回收,则输出"Object has been collected."
if (softRef.get() == null) {
System.out.println("Object has been collected.");
}
}
}
3 弱引用,地位稍低于软引用,一般用于防止内存泄漏,内存充足时依旧会被回收。弱引用是用包装的方法实现的,也就是一个强引用指向一个WeakReference.这个对象再指向真的对象
如果红色标记这里是强引用,那么哪时tl1引用编程空,threadlocal对象也不会消失,这就是内存泄漏问题了
(每个线程都已一个threadlocalmap,key是threadlocal,通过这种方式,实现了变量的多个副本)
4 虚引用