gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:52:22 25 4
gpt4 key购买 nike

我知道当一个 directbytebuffer 被分配时,它不受垃圾收集的影响,但我想知道的是 wrapping 对象是否被垃圾收集。

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

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

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

我最终会 OOM 吗?

最佳答案

在 Sun JDK 中,java.nio.DirectByteBuffer—由 ByteBuffer#allocateDirect(int) 创建— 有一个 sun.misc.Cleaner 类型的字段,它扩展了 java.lang.ref.PhantomReference .

当这个 Cleaner(记住,PhantomReference 的子类型)被收集并准备移入关联的 ReferenceQueue 时,收集-通过嵌套类型 ReferenceHandler 运行的相关线程对 Cleaner 实例进行特殊处理:它向下转换并调用 Cleaner#clean(),它最终返回调用 DirectByteBuffer$Deallocator#run(),后者又调用 Unsafe#freeMemory(long)。哇。

这相当曲折,令我惊讶的是没有看到任何 Object#finalize() 的使用。 Sun 开发人员一定有他们的理由将其与收集和引用管理子系统联系得更近。

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

关于java - 是否收集了 Java DirectByteBuffer 包装器垃圾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6697709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com