ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-11-22 14:35:41  阅读:148  来源: 互联网

标签:比非 NIO 创建 源码 缓冲区 磁盘 直接 底层


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

文章目录


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

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

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

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

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

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

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

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

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

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

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

标签:比非,NIO,创建,源码,缓冲区,磁盘,直接,底层
来源: https://blog.csdn.net/Kevinnsm/article/details/121469432

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有