java 引用类型 虚引用

对象终止化机制(finalization)
	Object类中有一个finalize方法,设计初衷是在一个对象被真正回收之前用来执行一些清理工作
	java并没有类似c++的析构函数就通过finalize方法实现。
	java垃圾回收器的运行时间是不固定的,所以清理工作的实际运行时间 是不能预知。
	虚引用用来解决(幽灵引用)
	创建虚引用PhantomReference的时候必须指定一个引用队列。
	当一个对象的finalize方法调用之后,这对象的虚引用会被加入到队列中,通过
	检查该队列里面的内容就知道一个对象是否准备要被回收。
作用
	主要用来实现比较精细的内存使用控制,对移动设备来说很有意义。

	缓冲区的实现

class PhantomBuffer{
	private byte[] data = new byte[0];
	private ReferenceQueue<byte[]> queue = new ReferenceQueue<byte[]>();
	private PhantomReference<byte[]> ref = new PhantomReference<byte[]>(data, queue);
	public byte[] get(int size){
		if(size<=0){
			throw new IllegalArgumentException("Wrong buffer size");
		}if (data.length<size) {
			data = null;
			System.gc();//强制运行垃圾回收器
			try {
				queue.remove();
				ref.clear();//虚引用不会自动清空,手动运行
				data = new byte[size];
				ref = new PhantomReference<byte[]>(data, queue);
			} catch (Exception e) {
				// TODO: handle exception
			}
		}
		return data;
	}
}
	引用队列
	在对象的可到达性发生变化的时候得到通知

	某个对象的强引用都已经不存在了,只剩下软引用或弱引用。典型的是哈希表
	引用对象是作为WeakHashMap的键对象,当其引用的实际对象被垃圾回收后,需要删除哈希表中的键值,
	在弱引用和软引用对象被添加到队列之前,它们对实际对象的引用会被自动清空。通过引用队列的poll/remove方法可以分别以
	非阻塞和阻塞的方式获取队列中的引用对象。

	软引用旨在告诉垃圾回收器程序中的哪些对象是不那么重要的,当内存不足的时候可以暂时回收,如果内存还不足,
	才会抛出OutOfMemory。
	软引用非常适合用于创建缓存

	弱引用强度上弱于软引用,虽然弱引用引用一个对象,但是并不阻止该对象被回收,如果一个对象的所有引用都是
	弱引用,则该对象会被回收。主要用于解决强引用所带来的对象之间在存活时间上的耦合关系。常用于集合类,
	尤其是哈希表中。(在强引用中,只要哈希表对象本身还存活,其中包含的键和值是不会被回收的,可能对导致最终消耗掉JVM的全部内存)

	强引用见得最多,类似 A a = new A();
	包含在a中的引用b,当且仅当a被垃圾回收后,b才有可能获得被垃圾回收的机会。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值