天天看點

Java NIO -- 直接緩沖區與非直接緩沖區

非直接緩沖區:通過 allocate() 方法配置設定緩沖區,将緩沖區建立在 JVM 的記憶體中

直接緩沖區:通過 allocateDirect() 方法配置設定直接緩沖區,将緩沖區建立在實體記憶體中。可以提高效率

位元組緩沖區要麼是直接的,要麼是非直接的。如果為直接位元組緩沖區,則 Java 虛拟機會盡最大努力直接在機 此緩沖區上執行本機 I/O 操作。也就是說,在每次調用基礎作業系統的一個本機 I/O 操作之前(或之後),

虛拟機都會盡量避免将緩沖區的内容複制到中間緩沖區中(或從中間緩沖區中複制内容)。

直接位元組緩沖區可以通過調用此類的 allocateDirect() 工廠方法 來建立。此方法傳回的 緩沖區進行配置設定和取消配置設定所需成本通常高于非直接緩沖區 。直接緩沖區的内容可以駐留在正常的垃圾回收堆之外,是以,它們對應用程式的記憶體需求量造成的影響可能并不明顯。是以,建議将直接緩沖區主要配置設定給那些易受基礎系統的本機 I/O 操作影響的大型、持久的緩沖區。一般情況下,最好僅在直接緩沖區能在程式性能方面帶來明顯好處時配置設定它們。

直接位元組緩沖區還可以過 通過FileChannel 的 map() 方法 将檔案區域直接映射到記憶體中來建立 。該方法傳回MappedByteBuffer 。Java 平台的實作有助于通過 JNI 從本機代碼建立直接位元組緩沖區。如果以上這些緩沖區中的某個緩沖區執行個體指的是不可通路的記憶體區域,則試圖通路該區域不會更改該緩沖區的内容,并且将會在通路期間或稍後的某個時間導緻抛出不确定的異常。

位元組緩沖區是直接緩沖區還是非直接緩沖區可通過調用其 isDirect() 方法來确定。提供此方法是為了能夠在性能關鍵型代碼中執行顯式緩沖區管理。

非直接緩沖區:

Java NIO -- 直接緩沖區與非直接緩沖區

直接緩沖區:

Java NIO -- 直接緩沖區與非直接緩沖區

代碼示例: