gpt4 book ai didi

java.nio.ByteBuffer - allocateDirect 和垃圾回收

转载 作者:行者123 更新时间:2023-11-30 08:43:44 27 4
gpt4 key购买 nike

我今天读了以下内容:

Direct ByteBuffer objects clean up their native buffers automatically but can only do so as part of Java heap GC — so they do not automatically respond to pressure on the native heap. GC occurs only when the Java heap becomes so full it can't service a heap-allocation request or if the Java application explicitly requests it (not recommended because it causes performance problems).

我的印象是,使用 Direct ByteBuffers 意味着您必须手动管理 native 内存的分配/解除分配,并且它根本不受 GC 的影响。然而这篇文章似乎是说,如果GC确实发生,那么直接的ByteBuffer 将被回收。

我认为在进行堆外存储时,主要动机之一是避免因 GC 可能出现的问题(例如长时间停顿)。

最佳答案

DirectByteBuffer 对象是非常小的对象,本质上只是保存指向 native 内存的指针。这允许在不扩展托管堆和零拷贝 IO 的情况下进行分配。

所以这些对象通常不会增加太多 GC 压力。

它们消耗的是 native 资源、虚拟地址空间和可能的物理内存或交换空间。如果您使用内存映射文件而不是 allocateDirect 创建的缓冲区,您可能会大大超过可用的物理内存,因为内存将由磁盘存储支持(类似于交换)。

您唯一不能做的事情是取消映射直接缓冲区指向的内存范围,至少不能通过官方 API 做到这一点。相反,一旦缓冲区本身被 GC 收集,底层内存就会被释放。

TL;DR:您没有获得完全手动的内存管理,但您确实摆脱了托管 Java 堆的一些限制。

关于java.nio.ByteBuffer - allocateDirect 和垃圾回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34094252/

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