文章首发于:clawhub.club


最近在用java操作LMDB,看看能不能代替BDB实现本地持久化队列的功能,碰到了HeapByteBuffer与DirectByteBuffer的坑。

HeapByteBuffer

内容维护在JVM中,容易做到垃圾回收,但是也容易被垃圾回收所影响,在flush到远程的时候,会先拷贝数据到直接内存,再发送。

DirectByteBuffer

其数据分配到堆外内存中,所以很多框架都会选择它进行网路交互。避免了数据的额外拷贝,也不会收到垃圾回收的影响。

应用场景

DirectByteBuffer适用于频繁的native IO操作,高吞吐量,低延迟。
HeapByteBuffer适用于数据量小,方便垃圾回收的场景。