JAVA NIO的allowcate(非直接缓冲区)与allocateDirect(直接缓冲区)的区别

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是创建效率低,读取和写入的效率高

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值