Java 四大引用
概述
- 在Java中,除了基础数据类型的变量,其他所有都是所谓的引用类型,指向各种不同的对象。
- 引用指某一个对象、某一块内存的开始地址,这与C/C++中指针的定义类似。
- Java将对象的引用划分为4个等级,分别是:强引用、软引用、弱引用和虚引用。根据不同引用类型可以灵活控制对象的生命周期,提高对象的回收效率。
强引用
- 强引用是使用最多的对象引用,无论任何情况下,只要强引用关系还存在,垃圾收集器都不会回收被引用的对象。
- 对于一个普通对象,如果没有其他的引用关系,只要超过了引用的作用域或者显式的将其他赋值为null,就可以被当作垃圾回收了,具体回收时机还是要看垃圾收集策略。
Object o = new Object();
软引用
- 在系统将要发生内存溢出之前,将软引用对象放入回收范围之中进行第二次回收,如果这次回收仍然没有足够的内存,会抛出内存溢出异常。
- 软引用通常用来实现内存敏感的缓存。
String str = "软引用对象";
SoftReference<String> ref = new SoftReference<>(str);
String s = ref.get();
弱引用
- 弱引用对象具有更短生命周期,只能生存到下一次垃圾收集发生为止。
- 当垃圾收集器扫描到只具有弱引用对象时,无论当前内存空间是否足够,都会回收它。垃圾收集器是一个优先级很低的线程,不一定能很快发现那些只具有弱引用的对象。在这种情况下,弱引用对象可以存在较长的时间。
String str = "弱引用对象";
WeakReference<String> weak = new WeakReference<>(str);
String s = weak.get();
虚引用
- 虚引用是所有引用类型中最弱的一个。
- 虚引用对象随时都可能被垃圾收集器回收。
- 它不能单独使用,无法通过虚引用获取被引用的对象。必须和引用队列一起,虚引用的目的是跟踪垃圾回收的过程。
String str = "虚引用对象";
ReferenceQueue<String> queue = new ReferenceQueue<>();
PhantomReference<String> phantom = new PhantomReference<>(str, queue);
String s = phantom.get();