深入浅出在NIO技术中,如何理解直接缓冲区要比非直接缓冲区效率高?
Posted Roninaxious
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入浅出在NIO技术中,如何理解直接缓冲区要比非直接缓冲区效率高?相关的知识,希望对你有一定的参考价值。
如何理解两者之间的效率高,主要是从allocate()方法和allocateDirect()这两个方法的源码进行分析
1.直接缓冲区的底层创建源码
直接缓冲区的创建通过allocateDirect()方法实现
可以看出它主要是通过DirectByteBuffer类来实现的(通过DirectByteBuffer直接操作Native内存)
通过这个构造函数可以看出它主要是通过UNSAFE类实现分配的,那么UNSAFE类是干什么呢?它是用来在堆外分配内存空间的。
2.非直接缓冲区的底层创建源码
非直接缓冲区通过allocate()工厂方法进行分配空间
它是如何分配的呢?查看源码分析
可以看出它通过HeapByteBuffer类来实现的。
在它的底层new了一个byte[cap]数组来存储数据,所以说它的本质上就是底层维护了一个字节数组,既然是使用new关键字,那么肯定是在JVM的堆区中创建的。
3.非直接缓冲区与直接缓冲区的具体实现
磁盘属于操作系统层面的,而我们的应用程序是在用户态下运行的(应用程序没权限直接访问);所以JVM与磁盘的交互需要在用户态和内核态之间进行切换。
非直接缓冲区
可以看出与磁盘的交互需要经过两次copy,这样一来效率就会降低。
直接缓冲区
通过直接创建物理内存映射了内核地址空间和用户地址空间,使得与磁盘交互少去了那两次copy操作,提高了效率;
通常来说使用直接缓冲区是优于非直接缓冲区的。直接缓冲适用于大文件、频繁读写的场合。
以上是关于深入浅出在NIO技术中,如何理解直接缓冲区要比非直接缓冲区效率高?的主要内容,如果未能解决你的问题,请参考以下文章