java Reference

1. 介绍

在java当中一切事物皆对象。那么每一个对象都在内存当中有自己的位置,当引用获取不得指向的对象的时候,java垃圾回收机制就会将此引用清理。
但经过Reference包装过的引用,根据包装的强度不同,在回收的时候也有不同的调度。

Reference子类:SoftReference,WeakReference,PhantomReference;按强度等级排列。

2. api接口:

Referenceget获取引用所指向的对象,若被回收返回空
ReferenceQueuepoll遍历队列,查看是否存在可用的引用对象,若存在,移除并返回,否则返回空
ReferenceQueueremove移除队列中下一个引用对象

3. Reference区别

引用说明特点使用场景
Strong Reference(强引用)只要对象存在引用,一直可以存活正常使用比如:new
Soft Reference(软引用)内存充足的时候,一直可以存活缓存
Weak Reference(弱引用)对象只要被使用,一直可以存活在垃圾回收之后获取对象
Phantom Reference(幽灵引用)get返回一直为Null。标识对象何时被回收
package com.pgy.collection;

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

public class ReferenceDemo2 {
    private static ReferenceQueue<Object> objQueue = new ReferenceQueue<Object>();

    public static void main(String[] args) {
        Object obj = null;
        System.out.println("****************testSoftReference*******************");
        testSoftReference(obj);
        System.out.println("****************testWeakReference*******************");
        testWeakReference(obj);
        System.out.println("****************testPhantomReference*******************");
        testPhantomReference(obj);
    }

    private static void testSoftReference(Object obj) {
        obj = new Object();
        SoftReference<Object> sr = new SoftReference<Object>(obj, objQueue);

        System.out.println(sr.get());
        System.out.println(objQueue.poll());
        obj = null;
        System.gc();

        System.out.println(sr.get());
        System.out.println(objQueue.poll());
    }

    private static void testWeakReference(Object obj) {
        obj = new Object();
        WeakReference<Object> wr = new WeakReference<Object>(obj, objQueue);
        System.out.println(wr.get());
        System.out.println(objQueue.poll());
        obj = null;
        System.gc();

        System.out.println(wr.get());
        System.out.println(objQueue.poll());
    }

    private static void testPhantomReference(Object obj) {
        obj = new Object();
        PhantomReference<Object> pr = new PhantomReference<Object>(obj, objQueue);

        System.out.println(pr.get());
        System.out.println(objQueue.poll());
        obj = null;
        System.gc();

        System.out.println(pr.get());
        System.out.println(objQueue.poll());
    }

}
//console
//****************testSoftReference*******************
//java.lang.Object@280bca
//null
//java.lang.Object@280bca
//null
//****************testWeakReference*******************
//java.lang.Object@1817fe89
//null
//null
//java.lang.ref.WeakReference@717e5fde
//****************testPhantomReference*******************
//null
//null
//null
//java.lang.ref.PhantomReference@39fc0f04

4. 参考

  1. http://www.cnblogs.com/newcj/archive/2011/05/15/2046882.html
  2. http://mindprod.com/jgloss/phantom.html
  3. http://www.importnew.com/17019.html

转载于:https://www.cnblogs.com/penggy/p/7475830.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值