对象的四种引用

一、强引用
     这是java程序中最常见的引用方式,程序创建一个对象,并把这个对象赋给一个引用变量,这个引用变量就是强引用。
      Java程序可通过强引用来访问来访问实际的对象。强引用是Java编程中广泛使用的引用类型,被强引用所引用的Java对象绝不会被垃圾回收机制回收,即使系统内存非常紧张;即使有些Java对象以后永远都不会被用到,JVM也不会回收被强引用所引用的Java对象。因此强引用是造成Java内存泄漏的主要原因之一。

二、软引用
       软引用需要通过SoftReference类实现,当一个对象只具有软引用时,它有可能被垃圾回收机制回收。对于只有软引用的对象而言,当系统内存空间足够时,它不会被系统回收,程序也可使用该对象;当系统内存空间不足时,系统将会回收它。
       软引用通常用于对内存敏感的程序中,软引用时强引用很好的替代。对于被强引用所引用的Java对象而言,无论系统内存如何紧张,即使某些Java对象以后再也不可能使用,垃圾回收机制依然不会回收它所占用的内存。对于软引用则不同,当系统内存空间充足时,软引用与强引用没有太大的区别;当系统内存空间不足时,被软引用所引用的Java对象可以被垃圾回收机制回收,从而避免系统内存不足的异常。

三、弱引用
         与软引用有点相似,区别在于弱引用所引用对象的生存期更短。弱引用通过WeakReference类实现,弱引用和软引用很像,但弱引用的引用级别更低。对于只有弱引用的对象而言,当系统垃圾回收机制运行时,不管系统内存是否足够,总会回收该对象所占用的内存。
            弱引用具有很大的不确定性,因为每次垃圾回收机制执行时都会回收弱引用所引用的对象,而垃圾回收机制的运行又不受程序员的控制,因此程序获取弱引用所引用的Java对象时必须小心空指针异常——通过弱引用所获取的Java对象可能是null。
       与 WeakReference功能类似的还有 WeakHashMap。其实程序很少会考虑直接使用单个的 WeakReference来引用某个Java对象,因此这种时候内存往往不会特别紧张。当程序有大量的Java对象需要使用弱引用来引用时,可以使用 WeakHashMap来保存它们。

四、虚引用
      虚引用不能单独使用,单独使用需引用没有太大的意义。虚引用的主要作用就是跟踪对象被垃圾回收的状态,程序可以通过检查与虚引用关联的引用队列中是否已经包含指定的虚引用,从而了解虚引用所引用对象是否即将被回收。
      引用队列由java.lang.ref.ReferenceQueue类表示,它用于保存被回收后对象的引用。
      虚引用通过PhantomReference类实现,它完全类似于没有引用。虚引用对对象本事没有太大影响,对象甚至感觉不到虚引用的存在。

猜你喜欢

转载自blog.csdn.net/zt_star/article/details/78854834