DirectByteBuffer操作的缓冲区是【allowcate非直接缓冲区】分配在jvm堆中(java字节数组)
HeapByteBuffer操作的缓冲区是【allocateDirect直接缓冲区】分配在堆外操作系统本地(c、c++的数组)
【HeapByteBuffer与DirectByteBuffer的区别】
1.创建的效率:
由于DirectByteBuffer操作的缓冲区是通过操作系统本地代码创建的,对于java来说创建和销毁DirectByteBuffer更消耗性能而HeapByteBuffer内部是直接创建的java数组,对于java来说更快。
2.IO效率:
直接内存相比非直接内存少了拷贝到程序的过程。所以本地IO(从操作系统本地获取数据,比如文件、socket网络数据)修改数据DirectByteBuffer是更快的。
【HeapByteBuffer与DirectByteBuffer如何选择】
以下情况适合HeapByteBuffer:
1、同一个HeapByteBuffer对象很少被复用,并且该对象经常是用一次就不用了,此时可以使用HeapByteBuffer,因为创建HeapByteBuffer开销比DirectByteBuffer低。(一般这种情况很少,基本都是创建几个对象进行多次复用)
以下情况适合DirectByteBuffer:
1、频繁的native IO,即缓冲区中转从操作系统获取的文件数据、或者使用缓冲区中转网络数据等
2、不需要经常创建和销毁DirectByteBuffer对象
3、经常复用DirectByteBuffer对象,即经常写入数据到DirectByteBuffer中,然后flip,再读取出来,最后clear。。反复使用该DirectByteBuffer对象。
而且,DirectByteBuffer不会占用堆内存。也就是不会受到堆大小限制,只在DirectByteBuffer对象被回收后才会释放该缓冲区。
总结:
HeapByteBuffer和DirectByteBuffer
1、HeapByteBuffer就是创建效率高,读取和写入的效率低。
2、DirectByteBuffer是创建效率低,读取和写入的效率高