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

时间:2015-12-04 17:39:47

标签: java garbage-collection

我今天阅读了以下内容:

  

Direct ByteBuffer对象自动清理其本机缓冲区   但只能作为Java堆GC的一部分这样做 - 所以他们不这样做   自动响应本机堆上的压力。 GC仅发生   当Java堆变得如此完整时,它无法为堆分配提供服务   请求或Java应用程序是否明确请求它(不是   推荐,因为它会导致性能问题)。

我的印象是使用Direct ByteBuffers意味着您必须手动管理本机内存的分配/释放,并且它根本不受GC影响。但是,这篇文章似乎说如果GC 发生,那么直接的ByteBuffer就会被收集。

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

1 个答案:

答案 0 :(得分:1)

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

因此,这些物体通常不会增加GC压力。

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

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

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