日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java-NIO(三):直接缓冲区与非直接缓冲区

發(fā)布時間:2025/3/15 java 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java-NIO(三):直接缓冲区与非直接缓冲区 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
  • 直接緩沖區(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ū)別:
  • 字節(jié)緩沖區(qū)要么是直接的,要么是非直接的。如果為直接字節(jié)緩沖區(qū),則 Java 虛擬機會盡最大努力直接在此緩沖區(qū)上執(zhí)行本機 I/O 操作。也就是說,在每次調(diào)用基礎操作系統(tǒng)的一個本機 I/O 操作之前(或之后),虛擬機都會盡量避免將緩沖區(qū)的內(nèi)容復制到中間緩沖區(qū)中(或從中間緩沖區(qū)中復制內(nèi)容)。
  • 直接字節(jié)緩沖區(qū)可以通過調(diào)用此類的 allocateDirect() 工廠方法來創(chuàng)建。此方法返回的緩沖區(qū)進行分配和取消分配所需成本通常高于非直接緩沖區(qū)。直接緩沖區(qū)的內(nèi)容可以駐留在常規(guī)的垃圾回收堆之外,因此,它們對應用程序的內(nèi)存需求量造成的影響可能并不明顯。所以,建議將直接緩沖區(qū)主要分配給那些易受基礎系統(tǒng)的本機 I/O 操作影響的大型、持久的緩沖區(qū)。一般情況下,最好僅在直接緩沖區(qū)能在程序性能方面帶來明顯好處時分配它們。
  • 直接字節(jié)緩沖區(qū)還可以通過 FileChannel 的 map() 方法 將文件區(qū)域直接映射到內(nèi)存中來創(chuàng)建。該方法返回MappedByteBuffer 。 Java 平臺的實現(xiàn)有助于通過 JNI 從本機代碼創(chuàng)建直接字節(jié)緩沖區(qū)。如果以上這些緩沖區(qū)中的某個緩沖區(qū)實例指的是不可訪問的內(nèi)存區(qū)域,則試圖訪問該區(qū)域不會更改該緩沖區(qū)的內(nèi)容,并且將會在訪問期間或稍后的某個時間導致拋出不確定的異常。
  • 字節(jié)緩沖區(qū)是直接緩沖區(qū)還是非直接緩沖區(qū)可通過調(diào)用其 isDirect() 方法來確定。提供此方法是為了能夠在性能關鍵型代碼中執(zhí)行顯式緩沖區(qū)管理。
    • 直接緩沖區(qū)與非直接緩沖區(qū)區(qū)別圖形示意:

    ?

    轉(zhuǎn)載于:https://www.cnblogs.com/yy3b2007com/p/7262453.html

    總結(jié)

    以上是生活随笔為你收集整理的Java-NIO(三):直接缓冲区与非直接缓冲区的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。