Java中的四种引用

转载 2017年03月21日 17:39:23

转自:http://blog.csdn.net/qq_23547831/article/details/46505287


Java中存在四种引用,它们分别是:

1. 强引用(StrongReference)

 强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。

2. 软引用(SoftReference)

如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。

软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。

3. 弱引用(WeakReference)

弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。

弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。  

4. 虚引用(PhantomReference)

"虚引用"顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。

虚引用主要用来跟踪对象被垃圾回收器回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之 关联的引用队列中。  

总结:

WeakReference与SoftReference都可以用来保存对象的实例引用,这两个类与垃圾回收有关。
WeakReference是弱引用,其中保存的对象实例可以被GC回收掉。这个类通常用于在某处保存对象引用,而又不干扰该对象被GC回收,通常用于Debug、内存监视工具等程序中。因为这类程序一般要求即要观察到对象,又不能影响该对象正常的GC过程。
最近在JDK的Proxy类的实现代码中也发现了Weakrefrence的应用,Proxy会把动态生成的Class实例暂存于一个由Weakrefrence构成的Map中作为Cache。

SoftReference是强引用,它保存的对象实例,除非JVM即将OutOfMemory,否则不会被GC回收。这个特性使得它特别适合设计对象Cache。对于Cache,我们希望被缓存的对象最好始终常驻内存,但是如果JVM内存吃紧,为了不发生OutOfMemoryError导致系统崩溃,必要的时候也允许JVM回收Cache的内存,待后续合适的时机再把数据重新Load到Cache中。这样可以系统设计得更具弹性。


一个实际的例子是Android中handler持有activity的隐式引用,当handler执行的任务耗时过程或者是无法完成时,就会出现内存溢出的情况,这时候我们可以为handler创建一个activity的弱引用:

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. static class MyHandler extends Handler {  
  2.     WeakReference<Activity > mActivityReference;  
  3.   
  4.     MyHandler(Activity activity) {  
  5.         mActivityReferencenew WeakReference<Activity>(activity);  
  6.     }  
  7.   
  8.     @Override  
  9.     public void handleMessage(Message msg) {  
  10.         final Activity activity = mActivityReference.get();  
  11.         if (activity != null) {  
  12.             mImageView.setImageBitmap(mBitmap);  
  13.         }  
  14.     }  
  15. }  

Java的四种引用

  • 2011年11月06日 10:06
  • 133KB
  • 下载

Java四种引用类型详解

java四种引用类型详解

Java的四种引用 初学者应该知道的

从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用。 1.强引用    本章前文介绍的引用实际...

Java 中对象的引用的四种级别

Java 中对象的引用的四种级别

Java虚拟机(七)——理解四种引用类型

介绍   如果一个内存中的对象没有任何引用的话,就说明这个对象已经不再被使用了,从而可以成为被垃圾回收的候选。不过由于垃圾回收器的运行时间不确定,可被垃圾回收的对象的实际被回收时间是不确定的。对于一...

java中的四种引用类型

一、强引用(StrongReference):相当于生活中的必需品,平时接触最多,不会被GC回收。当内存空间不足时,java虚拟机宁愿抛出OutOfMemoryEerror异常,也不愿意回收强引用对象...

Java四种引用类型分析

Java四种引用包括强引用,软引用,弱引用,虚引用。若一个对象不被任何一个变量引用,则该对象不能被程序使用。4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。强引用:只要引用存在,垃圾回收器永远...

Java中四种引用(强、软、弱、虚)

Java中存在四种引用,它们分别是: 1. 强引用(StrongReference)  强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟...

Java四种引用

1.强引用(Strong Reference); 2.软引用(Soft Reference); 3.弱引用(Weak Reference); 4.虚引用(Phantom Reference)....
  • sunp823
  • sunp823
  • 2015年04月29日 02:17
  • 198

java中四种引用方式

从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用。 1.强引用 本章前文介绍的引用实际上都是强...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java中的四种引用
举报原因:
原因补充:

(最多只允许输入30个字)