java对象软、弱和虚引用_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > java对象软、弱和虚引用

java对象软、弱和虚引用

 2012/4/15 1:21:55  liujiawinds  程序员俱乐部  我要评论(0)
  • 摘要:java.lang.ref包下提供了三个类SoftReference,phantomReferenceWeakReference,分别代表软引用,虚引用和弱引用C#中没有这些概念强引用,最常见的引用,程序创建一个对象,并把这个对象赋值给一个引用变量,通过该引用来实际操作对象软引用,需要通过SoftReference类来实现,当一个对象只有一个软引用,它有可能被垃圾回收机制回收。内存空间足够时,不会被回收,不足够时将被回收弱引用,需要通过WeakReference类来实现,当垃圾回收机制运行时
  • 标签:Java
java.lang.ref包下提供了三个类SoftReference,phantomReference WeakReference,分别代表软引用,虚引用和弱引用
C#中没有这些概念
强引用,最常见的引用,程序创建一个对象,并把这个对象赋值给一个引用变量,通过该引用来实际操作对象
软引用,需要通过SoftReference类来实现,当一个对象只有一个软引用,它有可能被垃圾回收机制回收。内存空间足够时,不会被回收,不足够时将被回收
弱引用,需要通过WeakReference类来实现,当垃圾回收机制运行时,不管内存是否足够,总会回收该对象所占用的内存
虚引用,通过phantomReference 类实现,虚引用类似于完全没有引用。主要用于跟踪对象被回收的状态 ,不能单独使用,必须和引用队列(ReferenceQueue)联合使用
上面三个引用类都包含一个get方法,用于获取它们所引用的对象
引用队列由java.langl.ref.ReferenceQueue类表示,用于保存被回收后对象的引用

import java.lang.ref.WeakReference;  
public class TestReference   
{  
    public static void main(String[] args)   
    {  
        //创建一个字符串对象  
        String str = new String("Structs2 权威指南");  
        //创建一个弱引用,让此引用引用到"Struts2 权威指南"字符串  
        WeakReference wr = new WeakReference(str);  
        //切断str引用和"Struts2 权威指南"字符串之间的引用   
        str = null;  
        //取出弱引用所引用的对象  
        System.out.println(wr.get());  
        //强制垃圾回收  
        System.gc();  
        System.runFinalization();  
        ///再次取出弱引用所引用的对象  
        System.out.println(wr.get());  
    }  
}  

输出:
Struts2 权威指南
null
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;  
public class TestReference   
{  
    public static void main(String[] args)   
    {  
        //创建一个字符串对象  
        String str = new String("Structs2 权威指南");
        //创建一个引用队列
        ReferenceQueue rq= new ReferenceQueue();
        //创建一个虚引用,让此虚引用引用到"Struts2 权威指南"字符串  
        PhantomReference pr = new PhantomReference(str, rq);  
        //切断str引用和"Struts2 权威指南"字符串之间的引用   
        str = null;  
        //取出虚引用所引用的对象  
        System.out.println(pr.get());  
        //强制垃圾回收  
        System.gc();  
        System.runFinalization();  
        ///再次取出虚引用所引用的对象  
        System.out.println(rq.poll()==pr);  
    }  
}  

输出:
null
true
发表评论
用户名: 匿名