我今天阅读了以下内容:
Direct ByteBuffer对象自动清理其本机缓冲区 但只能作为Java堆GC的一部分这样做 - 所以他们不这样做 自动响应本机堆上的压力。 GC仅发生 当Java堆变得如此完整时,它无法为堆分配提供服务 请求或Java应用程序是否明确请求它(不是 推荐,因为它会导致性能问题)。
我的印象是使用Direct ByteBuffers意味着您必须手动管理本机内存的分配/释放,并且它根本不受GC影响。但是,这篇文章似乎说如果GC 发生,那么直接的ByteBuffer就会被收集。
我认为在进行堆外存储时,其中一个主要动机是避免因GC而可能出现的问题(例如长时间暂停)。
答案 0 :(得分:1)
DirectByteBuffer对象是非常小的对象,基本上只是将指针保存到本机内存中。这允许在不扩展托管堆和零拷贝IO的情况下进行分配。
因此,这些物体通常不会增加GC压力。
他们消耗的是本机资源,虚拟地址空间以及可能的物理内存或交换空间。如果您使用内存映射文件而不是allocateDirect
创建的缓冲区,则可能会远远超过可用的物理内存,因为内存将由磁盘存储支持(类似于交换)。
至少通过官方API,你唯一不能做的就是取消直接缓冲区指向的内存范围。相反,一旦GC收集缓冲区本身,就会释放底层内存。
TL; DR:您没有完全手动内存管理,但您确实摆脱了托管Java堆的一些限制。