Java-NIO(三):直接缓冲区与非直接缓冲区
- 直接緩沖區(qū)與非直接緩沖區(qū)的概念:
1)非直接緩沖區(qū):通過
static ByteBuffer allocate(int capacity)創(chuàng)建的緩沖區(qū),在JVM中內(nèi)存中創(chuàng)建,在每次調(diào)用基礎操作系統(tǒng)的一個本機IO之前或者之后,虛擬機都會將緩沖區(qū)的內(nèi)容復制到中間緩沖區(qū)(或者從中間緩沖區(qū)復制內(nèi)容),緩沖區(qū)的內(nèi)容駐留在JVM內(nèi),因此銷毀容易,但是占用JVM內(nèi)存開銷,處理過程中有復制操作。
非直接緩沖區(qū)寫入步驟:
1.創(chuàng)建一個臨時的直接ByteBuffer對象。
2.將非直接緩沖區(qū)的內(nèi)容復制到臨時緩沖中。
3.使用臨時緩沖區(qū)執(zhí)行低層次I/O操作。
4.臨時緩沖區(qū)對象離開作用域,并最終成為被回收的無用數(shù)據(jù)。
2)直接緩沖區(qū) ? ?:通過
static ByteBuffer allocateDirect(int capacity)創(chuàng)建的緩沖區(qū),在JVM內(nèi)存外開辟內(nèi)存,在每次調(diào)用基礎操作系統(tǒng)的一個本機IO之前或者之后,虛擬機都會避免將緩沖區(qū)的內(nèi)容復制到中間緩沖區(qū)(或者從中間緩沖區(qū)復制內(nèi)容),緩沖區(qū)的內(nèi)容駐留在物理內(nèi)存內(nèi),會少一次復制過程,如果需要循環(huán)使用緩沖區(qū),用直接緩沖區(qū)可以很大地提高性能。雖然直接緩沖區(qū)使JVM可以進行高效的I/O操作,但它使用的內(nèi)存是操作系統(tǒng)分配的,繞過了JVM堆棧,建立和銷毀比堆棧上的緩沖區(qū)要更大的開銷。
- 直接緩沖區(qū)與非直接緩沖區(qū)的區(qū)別:
- 直接緩沖區(qū)與非直接緩沖區(qū)區(qū)別圖形示意:
?
轉(zhuǎn)載于:https://www.cnblogs.com/yy3b2007com/p/7262453.html
總結(jié)
以上是生活随笔為你收集整理的Java-NIO(三):直接缓冲区与非直接缓冲区的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用缓存的9大误区(上)(转)
- 下一篇: java美元兑换,(Java实现) 美元