当前位置: 代码迷 >> 综合 >> java 引用类型 虚引用
  详细解决方案

java 引用类型 虚引用

热度:81   发布时间:2023-09-23 11:29:15.0
对象终止化机制(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才有可能获得被垃圾回收的机会。