直接記憶體
阿新 • • 發佈:2021-11-13
參考資料:尚矽谷JVM教程
9.直接記憶體
9.1. 直接記憶體概述
不是虛擬機器執行時資料區的一部分,也不是《Java虛擬機器規範》中定義的記憶體區域。直接記憶體是在Java堆外的、直接向系統申請的記憶體區間。來源於NIO,通過存在堆中的DirectByteBuffer操作Native記憶體。通常,訪問直接記憶體的速度會優於Java堆,即讀寫效能高。
-
因此出於效能考慮,讀寫頻繁的場合可能會考慮使用直接記憶體。
-
Java的NIO庫允許Java程式使用直接記憶體,用於資料緩衝區
9.2. 非直接快取區
使用IO讀寫檔案,需要與磁碟互動,需要由使用者態切換到核心態。在核心態時,需要兩份記憶體儲存重複資料,效率低。
9.3. 直接快取區
使用NIO時,作業系統劃出的直接快取區可以被java程式碼直接訪問,只有一份。NIO適合對大檔案的讀寫操作。
也可能導致OutOfMemoryError異常
Exception in thread "main" java.lang.OutOfMemoryError: Direct buffer memory at java.nio.Bits.reserveMemory(Bits.java:693) at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:123) at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311) at com.atguigu.java.BufferTest2.main(BufferTest2.java:20)
由於直接記憶體在Java堆外,因此它的大小不會直接受限於-Xmx指定的最大堆大小,但是系統記憶體是有限的,Java堆和直接記憶體的總和依然受限於作業系統能給出的最大記憶體。
-
分配回收成本較高
-
不受JVM記憶體回收管理
直接記憶體大小可以通過MaxDirectMemorySize
設定。如果不指定,預設與堆的最大值-Xmx引數值一致