外国购物网站设计风格网站做记录访客
web/
2025/10/6 16:25:53/
文章来源:
外国购物网站设计风格,网站做记录访客,网站建设标题,WordPress二维码动态原标题#xff1a;Java 幽灵引用的作用来源#xff1a;imzoer#xff0c;blog.csdn.net/imzoer/article/details/8044900找实习的时候#xff0c;面试大摩#xff0c;就遇到了这个问题#xff0c;当时真不该跟面试官交流这个内容的。垃圾收集过程中#xff0c;对象的可触…原标题Java 幽灵引用的作用来源imzoerblog.csdn.net/imzoer/article/details/8044900找实习的时候面试大摩就遇到了这个问题当时真不该跟面试官交流这个内容的。垃圾收集过程中对象的可触及状态改变的时候可以把引用对象和引用队列关联起来【这里说的关联是说垃圾收集器会把要回收的对象添加到引用队列ReferenceQueue】这样在可触及性发生变化的时候得到“通知”。当垃圾收集器对加入队列的对象改变可触及性的时候就可以收到异步通知了。看下面的代码package static_;import java.lang.ref.PhantomReference;import java.lang.ref.Reference;import java.lang.ref.ReferenceQueue;import java.lang.reflect.Field;public class Test {public static boolean isRun true;SuppressWarnings(static-access)public static void main(String[] args) throws Exception {String abc new String(abc);System.out.println(abc.getClass() abc.hashCode());final ReferenceQueue referenceQueue new ReferenceQueue();new Thread() {public void run() {while (isRun) {Object obj referenceQueue.poll();if (obj ! null) {try {Field rereferent Reference.class.getDeclaredField(referent);rereferent.setAccessible(true);Object result rereferent.get(obj);System.out.println(gc will collect result.getClass() result.hashCode() t (String) result);} catch (Exception e) {e.printStackTrace();}}}}}.start();PhantomReference abcWeakRef new PhantomReference(abc,referenceQueue);abc null;Thread.currentThread().sleep(3000);System.gc();Thread.currentThread().sleep(3000);isRun false;}}我们用一个线程检测referenceQueue里面是不是有内容如果有内容打印出来queue里面的内容。从这个例子中我们可以看出来虚引用的作用是我们可以声明虚引用来引用我们感兴趣的对象在gc要回收的时候gc收集器会把这个对象添加到referenceQueue这样我们如果检测到referenceQueue中有我们感兴趣的对象的时候说明gc将要回收这个对象了。此时我们可以在gc回收之前做一些其他事情比如记录些日志什么的。感谢蓝大牛分享下面的例子。在java中finalize函数本来是设计用来在对象被回收的时候来做一些操作的(类似C的析构函数)。但是对象被GC什么时候回收的时间却是不固定的这样finalize函数很尴尬。虚引用可以用来解决这个问题。在创建虚引用的时候必须传入一个引用队列。在一个对象的finalize函数被调用之后这个对象的幽灵引用会被加入到引用队列中。通过检查队列的内容就知道对象是不是要准备被回收了。幽灵引用的使用并不多见主要是实现细粒度的内存控制。比如下面代码实现一个缓存。程序在确认原来的对象要被回收之后才申请内存创建新的缓存。在上面的代码中每次申请新的缓存的时候都要确保之前的字节数组被成功回收。引用队列的remove方法会阻塞直到虚引用被加入到引用队列中。【只有对象在内存中被移除之后才会进入引用队列中】。不过注意这种方式可能会导致gc次数过多程序吞吐量下降。另外注意system.gc调用仅仅是建议虚拟机进行回收并不一定马上会进行gc。返回搜狐查看更多责任编辑
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/88006.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!