有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JAVA尼奥。ByteBuffer allocateDirect和垃圾回收

我今天读了以下内容:

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意味着您必须手动管理本机内存的分配/解除分配,并且它根本不受GC的约束。然而,本文似乎指出,如果GC确实发生了,那么直接ByteBuffer将被收集

我认为在进行堆外存储时,一个主要的动机是避免由于GC而可能出现的问题(例如长时间暂停)


共 (1) 个答案

  1. # 1 楼答案

    DirectByteBuffer对象是非常小的对象,基本上只是将指针放入本机内存中。这允许在不扩展托管堆和零拷贝IO的情况下进行分配

    所以这些物体通常不会增加多少GC压力

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

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

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