强引用 > 软引用 > 弱引用 > 虚引用
一,强引用
Object obj = new Object0;//只要obj还指向Object对象,Object对象就不会被回收obj = null;//手动置null
强引用存在,垃圾回收器就不会回收被引用的对象,内存不足是,JVM也会直接抛出异常,而不会去回收。可以将强引用的值手动置为null,这样JVM就会回收强引用。
强引用的特点:
强引用可以直接访问目标对象。
强引用所指向的对象在任何时候都不会被系统回收。JVM宁愿抛出OOM异常,也 不会回收强引用所指向的对象。
强引用可能导致内存泄漏。
二,软引用
String str=new String("abc"); // 强引用SoftReference<String> softRef=new SoftReference<String>(str); // 软引用当内存不足时,等价于:If(JVM.内存不足()) {
str = null; // 转换为软引用 System.gc(); // 垃圾回收器进行回收}
软引用是除了强引用外,最强的引用类型。可以通过java.lang.ref.SoftReference使用软引用。一个持有软引用的对象,不会被JVM很快回收,JVM会根据当前堆的使用情况来判断何时回收。当堆使用率临近阈值时,才会去回收软引用的对象。因此,软引用可以用于实现对内存敏感的高速缓存。在JDK1.2之后,用java.lang.ref.SoftReference类来表示软引用。
三,弱引用
弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。在JDK1.2之后,用java.lang.rf.WeakReference来表示弱引用。
四,虚引用
虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。不能单独存在,必须和引用队列联合使用。主要作用是跟踪对象被回收的状态!
五,引用队列
一旦弱引用对象开始返回null,该弱引用指向的对象就被标记成了垃圾。而这个弱引用对象(非其指向的对象)就没有什么用了。通常这时候需要进行一些清理工作。比如WeakHashMap会在这时候移除没用的条目来避免保存无限制增长的没有意义的弱引用。
引用队列可以很容易地实现跟踪不需要的引用。当你在构造WeakReference时传入一个ReferenceQueue对象,当该引用指向的对象被标记为垃圾的时候,这个引用对象会自动地加入到引用队列里面。接下来,你就可以在固定的周期,处理传入的引用队列,比如做一些清理工作来处理这些没有用的引用对象。
本文详细介绍了Java中的四种引用类型:强引用、软引用、弱引用和虚引用,并解释了它们的特点及应用场景。此外,还介绍了引用队列的概念及其在垃圾回收过程中的作用。

被折叠的 条评论
为什么被折叠?



