深入浅出在NIO技术中,如何理解直接缓冲区要比非直接缓冲区效率高?
如何理解兩者之間的效率高,主要是從allocate()方法和allocateDirect()這兩個方法的源碼進行分析
文章目錄
- 1.直接緩沖區的底層創建源碼
- 2.非直接緩沖區的底層創建源碼
- 3.非直接緩沖區與直接緩沖區的具體實現
1.直接緩沖區的底層創建源碼
直接緩沖區的創建通過allocateDirect()方法實現
可以看出它主要是通過DirectByteBuffer類來實現的(通過DirectByteBuffer直接操作Native內存)
通過這個構造函數可以看出它主要是通過UNSAFE類實現分配的,那么UNSAFE類是干什么呢?它是用來在堆外分配內存空間的。
2.非直接緩沖區的底層創建源碼
非直接緩沖區通過allocate()工廠方法進行分配空間
它是如何分配的呢?查看源碼分析
可以看出它通過HeapByteBuffer類來實現的。
在它的底層new了一個byte[cap]數組來存儲數據,所以說它的本質上就是底層維護了一個字節數組,既然是使用new關鍵字,那么肯定是在JVM的堆區中創建的。
3.非直接緩沖區與直接緩沖區的具體實現
磁盤屬于操作系統層面的,而我們的應用程序是在用戶態下運行的(應用程序沒權限直接訪問);所以JVM與磁盤的交互需要在用戶態和內核態之間進行切換。
非直接緩沖區
可以看出與磁盤的交互需要經過兩次copy,這樣一來效率就會降低。
直接緩沖區
通過直接創建物理內存映射了內核地址空間和用戶地址空間,使得與磁盤交互少去了那兩次copy操作,提高了效率;
通常來說使用直接緩沖區是優于非直接緩沖區的。直接緩沖適用于大文件、頻繁讀寫的場合。
總結
以上是生活随笔為你收集整理的深入浅出在NIO技术中,如何理解直接缓冲区要比非直接缓冲区效率高?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入浅出Java复用类【从字节码角度看t
- 下一篇: 【大白话系列】深入浅出Cleaner+虚