NIO直接緩衝區與非直接緩衝區
阿新 • • 發佈:2019-02-19
非直接緩衝區:通過allocate()方法分配緩衝區,將緩衝區建立在jvm記憶體中。
直接緩衝區:通過allocateDirect() 方法分配直接緩衝區,將緩衝區建立在實體記憶體中。可以提高效率。
位元組緩衝區要麼是直接的要麼是非直接的。如果是直接緩衝區,則java虛擬機器會盡最大努力直接在此緩衝區上執行本機IO操作。也就是說,在每次呼叫基礎作業系統的一個本機IO操作之前(或之後)虛擬機器都會盡量避免將緩衝區的內容複製到中間緩衝區中(或從中間緩衝區中複製內容)。
直接直接緩衝區可以通過呼叫此類的allocateDirect()工廠方法來建立。此方法返回的緩衝區進行分配和取消分配所需要的成本通常高於非直接緩衝區。直接緩衝區的內容可以駐留在常規的垃圾回收堆中,此外,他們對應用程式的記憶體需求量造成的影響可能並不明顯。所以,建議將緩衝區主要分配在那些容易受基礎系統的本機IO操作影響的大型、持久的緩衝區。一般情況下,最好僅在直接緩衝區能在程式效能方面帶來明顯好處時分配它們。
直接緩衝區還可以通過FileChannel的map()方法將檔案區域直接對映到記憶體中來建立。該方法返回MappedByteBuffer。java平臺的實現有助於通過JNI從本機程式碼建立直接位元組緩衝區。如果以上這些緩衝區中的某個緩衝區例項指的是不可訪問的記憶體區域,則試圖訪問該區域不會改變該區域的內容,並且將會在訪問期間或稍後某個時間丟擲不確定的異常
位元組緩衝區是直接緩衝區還是非直接緩衝區可以通過呼叫其isDirect()方法來確定。提供此方法是為了能夠在效能關鍵型程式碼中執行顯式緩衝區管理。