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 楼答案
DirectByteBuffer对象是非常小的对象,基本上只是将指针放入本机内存中。这允许在不扩展托管堆和零拷贝IO的情况下进行分配
所以这些物体通常不会增加多少GC压力
它们消耗的是本机资源、虚拟地址空间,可能还有物理ram或交换空间。如果使用内存映射文件而不是
allocateDirect
创建的缓冲区,则可能会大大超过可用的物理ram,因为内存将由磁盘存储支持(类似于交换)至少通过官方API,唯一不能做的事情是取消直接缓冲区指向的内存范围的映射。相反,一旦GC收集到缓冲区本身,就会释放底层内存
TL;DR:您没有完全手动的内存管理,但是您确实摆脱了托管java堆的一些限制