JAVA高階基礎(47)---直接緩衝區和非直接緩衝區
直接和非直接緩衝區
位元組緩衝區要麼是直接的,要麼是非直接的。如果為直接位元組緩衝區,則Java虛擬機器會盡最大努力直接在此緩衝區上執行本機I/O操作。也就是說,在每次呼叫基礎作業系統的一個本機I/O操作之前(或之後),虛擬機器都會盡量避免將緩衝區的內容複製到中間緩衝區中(或從中間緩衝區中複製內容)
直接位元組緩衝區可以通過呼叫此類的 allocateDirect() 工廠方法來建立。此方法返回的緩衝區進行分配和取消分配所需成本通過高於非直接緩衝區。直接緩衝區的內容可以駐留在常規的垃圾回收堆之外,因此,他們對應用程式的記憶體需求量造成的影響可能並不明顯。所以,建議將直接緩衝區主要分配給那些易受基礎系統的本機I/O操作影響的大型、持久的緩衝區
直接位元組緩衝區還可以通過 FileChannel 的 map() 方法將檔案區域直接對映到內從中來建立。該方法返回 MappedByteBuffer 。Java平臺的實現有助於通過 JNI 從本機程式碼建立直接位元組緩衝區。如果以上這些緩衝區中的某個緩衝區例項指的是不可訪問的記憶體區域,則試圖訪問該區域不會更改該緩衝區的內容,並且將會在訪問期間或 稍後的某個時間導致丟擲不確定的異常
位元組緩衝區是直接緩衝區還是飛直接緩衝區可通過呼叫其 isDirect() 方法來確定。提供此方法是為了能夠在效能關鍵型程式碼中執行顯示緩衝區管理。
非直接緩衝區
直接緩衝區
小結
直接緩衝區:直接位於記憶體頁
優點:IO操作效能高
特點:分配資源消耗大 位於堆疊記憶體之外 不容易被垃圾回收器所回收
應用:一般將直接緩衝區分配給易受基礎系統的本機 I/O 操作影響的大型、持久的緩衝區。
非直接緩衝區 :位於堆區
相對直接緩衝區來說,效率較低
但是佔用資源較少,容易被釋放
package org.lanqiao.nio.buffer;
import java.nio.ByteBuffer;
public class DirectBufferDemo {
public static void main(String[] args) {
ByteBuffer buf1 = ByteBuffer.allocate(1024);//非直接緩衝區
ByteBuffer buf2 = ByteBuffer.allocateDirect(1024);//直接緩衝區
System.out.println(buf1.isDirect());
System.out.println(buf2.isDirect());
}
}