1.强引用
- 默认的引用类型
- 如果一个对象具有强引用,那么垃圾回收器是不会对它进行回收的,当内存不足的时候,Java虚拟机将抛出OutOfMemoryError错误。
- 如果想切断强引用和某个对象的关联,可以显式地将引用赋值为null,JVM在合适的时间就会回收该对象
2.软引用 SoftReference
- 如果一个对象只有软引用,内存充足的时候,垃圾回收器不会对它进行回收操作,
- 当内存不足的时候,这个对象会被回收。
- 实现内存敏感的高速缓存
- 配合ReferenceQueue使用,当软引用指向的对象被垃圾回收器回收后,Java虚拟机将会把这个软引用加入到与之关联的引用队列中。
3.弱引用 WeakReference
- 弱引用比软引用更弱
- 只有弱引用指向的对象的生命周期更短,当垃圾回收器扫描到只具有弱引用对象时,不论当前内存空间是否不足,都会对弱引用进行回收。
- 不过垃圾回收器是优先级较低的线程,不能迅速发现弱引用
- 配合ReferenceQueue使用,当弱引用指向的对象被垃圾回收器回收后,Java虚拟机将会把这个弱引用加入到与之关联的引用队列中。
4.虚引用 PhantomReference
- 和软引用,弱引用不同,虚引用不会对所指向的对象生命周期产生影响
- 本质是一个标记作用,用来跟踪对象被垃圾回收的活动,虚引用必须和队列配合使用
- 配合ReferenceQueue使用,当虚引用指向的对象被垃圾回收器回收后,Java虚拟机将会把这个虚引用加入到与之关联的引用队列中。
5. 引用队列 ReferenceQueue
- 配合软引用,弱引用,虚引用使用,当引用的对象将要被JVM回收时,会将其加入到引用队列中。
- 通过引用队列可以了解JVM垃圾回收情况。
6.使用场景
- 利用软引用和弱引用解决OOM问题:用一个HashMap来保存图片的路径和相应图片对象关联的软引用之间的映射关系,在内存不足时,JVM会自动回收这些缓存图片对象所占用的空间,从而有效地避免了OOM的问题
- 通过软可及对象重获方法实现Java对象的高速缓存:
- 比如我们创建了一Employee的类,如果每次需要查询一个雇员的信息。哪怕是几秒中之前刚刚查询过的,都要重新构建一个实例,这是需要消耗很多时间的。我们可以通过软引用和 HashMap 的结合,先是保存引用方面:以软引用的方式对一个Employee对象的实例进行引用并保存该引用到HashMap 上,key 为此雇员的 id,value为这个对象的软引用,另一方面是取出引用,缓存中是否有该Employee实例的软引用,如果有,从软引用中取得。如果没有软引用,或者从软引用中得到的实例是null,重新构建一个实例,并保存对这个新建实例的软引用
参考:《Android高级进阶》-顾浩鑫
网友评论