加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java直接内存:在自定义类中使用sun.misc.Cleaner

发布时间:2020-12-14 16:46:45 所属栏目:Java 来源:网络整理
导读:在 Java中,由nio直接缓冲区分配的内存与sun.misc.Cleaner实例一起释放,一些特殊的幻像引用比对象最终化更有效. 这个更清洁的机制是否仅在直接缓冲区子类中在JVM中硬编码,或者是否可以在自定义组件中使用清理程序(例如编写自定义直接字节缓冲区)? 在这里,我
在 Java中,由nio直接缓冲区分配的内存与sun.misc.Cleaner实例一起释放,一些特殊的幻像引用比对象最终化更有效.

这个更清洁的机制是否仅在直接缓冲区子类中在JVM中硬编码,或者是否可以在自定义组件中使用清理程序(例如编写自定义直接字节缓冲区)?

在这里,我不是在谈论检索一个现有的nio直接缓冲区的更清洁的字段.我不是在说手工释放内存.这是关于编写一个分配直接内存的新类,并通过垃圾收集器机制高效自动清理.

解决方法

在花更多的时间阅读API文档( http://docs.oracle.com/javase/7/docs/api/java/lang/ref/package-summary.html)后,我想我有一个更详细的答案:

1)可以重用sun.misc.Cleaner来执行自己的自定义类的高效清理.您通过调用提供的工厂方法来声明清洁器:

sun.misc.Cleaner.create(Object ob,Runnable cleanup);

有一段时间,我无法让它正常工作,这是因为我很愚蠢,足以将我的清洁工的可执行的清理代码定义为匿名类,它保持(强)引用我的指示对象,阻止它从不被“幻影可达“…

2)没有其他方法来实现这种有效的清理(甚至没有幻影参考的帮助)

实际上,引用处理程序线程以特殊方式处理sun.misc.Cleaner的实例:

// Fast path for cleaners
if (r instanceof Cleaner) {
    ((Cleaner)r).clean();
    continue;
}

这意味着清理代码直接从引用处理程序线程调用,而在标准使用中,引用必须由引用处理程序线程入队,然后由另一个应用程序线程出队并处理.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读