深入浅出在NIO技术中,如何理解直接缓冲区要比非直接缓冲区效率高?

如何理解两者之间的效率高,主要是从allocate()方法和allocateDirect()这两个方法的源码进行分析


1.直接缓冲区的底层创建源码

直接缓冲区的创建通过allocateDirect()方法实现

在这里插入图片描述
可以看出它主要是通过DirectByteBuffer类来实现的(通过DirectByteBuffer直接操作Native内存
在这里插入图片描述
通过这个构造函数可以看出它主要是通过UNSAFE类实现分配的,那么UNSAFE类是干什么呢?它是用来在堆外分配内存空间的。

2.非直接缓冲区的底层创建源码

非直接缓冲区通过allocate()工厂方法进行分配空间

它是如何分配的呢?查看源码分析
在这里插入图片描述可以看出它通过HeapByteBuffer类来实现的。
请添加图片描述
在它的底层new了一个byte[cap]数组来存储数据,所以说它的本质上就是底层维护了一个字节数组,既然是使用new关键字,那么肯定是在JVM的堆区中创建的。

3.非直接缓冲区与直接缓冲区的具体实现

磁盘属于操作系统层面的,而我们的应用程序是在用户态下运行的(应用程序没权限直接访问);所以JVM与磁盘的交互需要在用户态和内核态之间进行切换。

非直接缓冲区在这里插入图片描述
可以看出与磁盘的交互需要经过两次copy,这样一来效率就会降低。

直接缓冲区
在这里插入图片描述通过直接创建物理内存映射了内核地址空间和用户地址空间,使得与磁盘交互少去了那两次copy操作,提高了效率;

通常来说使用直接缓冲区是优于非直接缓冲区的。直接缓冲适用于大文件、频繁读写的场合。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Thecoastlines

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值