- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我知道当一个 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/
我计划使用 DirectByteBuffers 来连接用 C++ 编写的第三方库。 我很担心the hadoop docs说: DirectByteBuffers are garbage collec
绝大多数 DirectByteBuffer - 如果足够大 - 是在 Java 堆之外分配的。但是它的一部分仍然会在堆上,即使它很小。 任意大小的 DirectByteBuffer 在堆上占用多少字节
我的代码是: if (frameRGBABuffer == null) { frameRGBABuffer = ByteBuffer.allocateDirect(cameraHeight *
我知道当一个 directbytebuffer 被分配时,它不受垃圾收集的影响,但我想知道的是 wrapping 对象是否被垃圾收集。 例如,如果我分配了一个新的 DirectByteBuffer d
我知道一种方法 - 在 C++ 端使用 memcpy: C++ 方法: void CopyData(void* buffer, int size) { memcpy(buffer, sourc
我在 DirectByteBuffer.java 中找到了这段代码: private long ix(int i) { return address + (i << 0); } 有什么特殊用途
出于某种原因,我必须使用目前无法从 JVM 直接访问的特定于 Linux 的 API,并且需要设计一个接受 ByteBuffer 的方法(这绝对不是因为某些性能原因)。这是它的样子: //I need
好吧,这让我的小心思感到困惑。 我从对 GetObjectField() 的两次调用之一中得到了 null 返回。每个对象都是一个 DirectByteBuffer。该调用不会因找不到字段而引发异常,
我想在 DirectByteBuffer 中存储一个散列映射(最多 1,000,000,000 个条目),我需要向其中读取和写入条目。 HashMap 将有一个字符串键和可序列化的对象。但是如果将 H
我有一个 Java 项目,它通过 COM 使用一个 dll 库。我有 Windows 7,并且使用 32 位 Java 1.6。我使用 2012/04/26 发布的 com4j 作为桥梁。它有效。 问
我正在使用 async-profiler 和 perf,并决定测量 DirectByteBuffer 的内核 Activity 磁盘输入输出。这是代码(用 Scala 编写,但它的 Java 版本应该
我想做什么 我需要使用直接内存来避免 GC 移动东西。我想为那些启用大页面。 到目前为止 标志 -XX:+UseLargePages 在使用堆缓冲区(非直接字节缓冲区)时工作正常,但在使用 Direc
我是 Clojure 的新手,我需要 Clojure 为我做一个简单的任务,相当于下面的 Java 代码: MappedByteBuffer out = new RandomAccessFile("f
得到了一个仍然支持 Java 6 的项目。下面的代码位于一个 jar 文件中,该文件使用 Compiler compliance level 1.6 该 jar 文件应该从为 java 6 或更新版本
我是一名优秀的程序员,十分优秀!