weak,soft,phtom Reference,软,弱,虚引用!

前面的简介:

strongReference:强引用

softReference:软引用。

weakReference:弱引用

phtomReference:虚引用

 

一:strongReference

String a = new String("hello world");
String b=a;

 咯,这里b就是个强引用咯。反正就是会一直指向那个String的。也就是大家最常用的。

 

二:softReference

String a = new String("hello world");
        
ReferenceQueue<String> queue = new ReferenceQueue<String>();
SoftReference<String> ref = new SoftReference<String>(a, queue);

 

    这些reference主要的作用就是体现在gc的时候了。softReference的作用是:

 

写道
当对象是Soft reference可达时,gc可能会向操作系统申请更多内存,而不是直接回收它,当实在没辙了才回收它。像cache系统,最适合用Soft reference。

 

    我的理解就是,GC对Soft reference 还是比较客气的,内存不够的时候才把它干掉,也就是在jvm抛出outOfMemory异常之前,会把这些都给回收掉,以空闲处内存。当内存不足的时候, 这些就会被无情的干掉了。

 

    现在我们来看下它的gc过后的效果。

 

 

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;

/**
 * @author guoliang created TestReferenceMain.java
 * @since 2010-5-7 下午06:31:35
 */
public class TestReferenceMain {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String a = new String("hello world");
        ReferenceQueue<String> queue = new ReferenceQueue<String>();
        SoftReference<String> ref = new SoftReference<String>(a, queue);
//        WeakReference<String> ref = new WeakReference<String>(a, queue);
//        PhantomReference<String> ref = new PhantomReference<String>(a, queue);
        a = null;
        System.gc();
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        String value = ref.get();
        System.out.println(value);
        System.out.println(ref.isEnqueued());
        System.out.println(queue.poll());

    }

}
 

    输出结果为:

[Full GC 317K->169K(5056K), 0.1891790 secs]
hello world
false
null

 

 

    可以看出,虽然gc了,但是这个reference还是没有被回收,因为当前的内存还是充足的,大家可以在这里做个例子,

让它outOfMemory再来看看这个reference是否还在,我做过实验,是会没的,oh yeah!~

 

三:weakReference

String a = new String("hello world");
ReferenceQueue<String> queue = new ReferenceQueue<String>();
WeakReference<String> ref = new WeakReference<String>(a, queue);
 
写道
Weak reference,简单地说就是这个引用不会强到迫使对象必须保持在内存中。Gc不会碰Strong reference可达的对象,但可以碰weak reference可达的对象。

    简单的说:就是gc会蹂躏这种对象,一GC,发现这种对象没人引用了,就把丫的给回收了,不给你机会的。

代码来看看结果.

 

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;

/**
 * @author guoliang created TestReferenceMain.java
 * @since 2010-5-7 下午06:31:35
 */
public class TestReferenceMain {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String a = new String("hello world");
        
        ReferenceQueue<String> queue = new ReferenceQueue<String>();
//        SoftReference<String> ref = new SoftReference<String>(a, queue);
        WeakReference<String> ref = new WeakReference<String>(a, queue);
//        PhantomReference<String> ref = new PhantomReference<String>(a, queue);
        a = null;
        System.gc();
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        String value = ref.get();
        System.out.println(value);
        System.out.println(ref.isEnqueued());
        System.out.println(queue.poll());

    }

}

 

   输出结果为:

 

 

[Full GC 317K->169K(5056K), 0.0074055 secs]
null
true
java.lang.ref.WeakReference@14318bb

 

    可以看到一不引用a,一gc,weakReference对应的就被回收了。

 

    后记:soga,弄完这个感觉还是不错的,以前很少去关注这个。然后就是在eclipse里面调用system.gc还是有用的,想要打出gc的详情可以 在ecliose的run的configure里面的arguments里面加上对应的参数:

 

   

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值