当前位置: 首页 > 面试题库 >

是否收集了Java DirectByteBuffer包装器垃圾?

屠嘉
2023-03-14
问题内容

我知道当分配DirectbyteBuffer时,它不受垃圾回收的限制,但是我想知道的是 包装 对象是否被垃圾回收了。

例如,如果我分配了一个新的DirectByteBuffer
dbb,然后使用dbb.duplicate()将其复制(浅复制),则我将在同一块内存中使用两个包装器。

这些包装器是否要进行垃圾收集?如果我做了

while(true){
    DirectByteBuffer dbb2 = dbb.duplicate();
}

我最终会自己OOM吗?


问题答案:

在Sun
JDK中,由java.nio.DirectByteBuffer创建的ByteBuffer#allocateDirect(int)a具有类型字段sun.misc.Cleaner,该字段扩展为java.lang.ref.PhantomReference

当此Cleaner(记住,是的子类型PhantomReference)被收集并即将移入关联时ReferenceQueue,通过嵌套类型运行的与集合相关的线程ReferenceHandlerCleaner实例进行特殊处理:它向下转换并调用Cleaner#clean(),最终使它返回进行调用DirectByteBuffer$Deallocator#run(),依次进行调用Unsafe#freeMemory(long)。哇。

这相当circuit回,我很惊讶没有看到游戏中的任何使用Object#finalize()。Sun开发人员必须将其原因归结到更靠近收集和参考管理子系统的地方。

简而言之,DirectByteBuffer只要垃圾回收器有机会注意到这种放弃,并且其引用处理线程通过上述调用取得了进展,就不会因为放弃引用实例而耗尽内存



 类似资料:
  • 由于ElasticSearch是基于Java语言的应用,所以它必须运行在Java虚拟机上。任何Java程序都被编译成字节码,然后才能运行在JVM上。用最常规的方式思考,可以想象JVM只是执行其它的程序,并且控制程序的行为。但是除非你是在为ElasticSearch开发新的插件(这部分的内容将在第9章 开发ElasticSearch插件中论述),否则这不是你关注的重点。你需要关注的重点是垃圾收集器,

  • 问题内容: 与同事进行了讨论。当诸如c#或java垃圾之类的语言收集诸如字符串之类的对象并将其返回到堆时,它们是否也清除了该内存块,例如用0或1覆盖? 我的假设是,除非按原样返回该块,除非使用诸如带有带有finalize重载的securestring之类的类将该块清零。 问题答案: 实际上,不,这不会发生。覆盖刚刚释放的内存需要花费时间,因此会有性能损失。“安全”之类的物体SecureString

  • 问题内容: 我对Java中的垃圾回收如何工作感到有些困惑。 我得到一个对象,当它不再有实时引用时,就可以进行垃圾回收,但是如果它引用了实时对象又该怎么办? 可以说我有一个节点集合,再次引用了更多节点 现在,如果我删除列表,则应该对节点cd和e进行垃圾回收。节点e没有更多引用,而节点c和d具有循环引用。 但是节点a呢?会被垃圾收集吗? 节点b是否具有外部实时引用会有所不同吗?假设节点b从另一个地方引

  • 问题内容: 该问题已发布在某个网站上。我在这里找不到正确的答案,因此我将其再次发布在这里。 我的查询与停止线程无关。让我改一下我的问题。A行(请参见上面的代码)启动一个新线程;和B行使线程引用为空。因此,JVM现在具有一个线程对象(处于运行状态),该对象不存在引用(如B行中的t = null)。所以我的问题是,为什么这个线程(在主线程中不再有引用)一直保持运行状态,直到主线程运行。根据我的理解,线

  • 问题:那么扫一扫实际上是什么意思?它是实际的垃圾回收(回收无法访问的对象并释放内存?)?还是意味着什么不同? 如果是这样,如果我们省略了扫描阶段,我们会遇到什么样的麻烦?

  • 问题内容: 我已经读过,Perm gen(或Permanent Generation)空间不是垃圾收集的。但是,在CMS集合中,我可以在GC日志中看到一些正在卸载的类。那么,在完全收集或CMS收集期间是否会收集烫发垃圾? 问题答案: PermGen像堆的其他部分一样被垃圾收集。 这里要注意的是PermGen包含类和对象的元数据,即指向分配对象的堆其余部分的指针。PermGen还包含类加载器,在使用