对象终止化机制(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才有可能获得被垃圾回收的机会。
java 引用类型 虚引用
最新推荐文章于 2024-03-14 21:44:23 发布