1. 程式人生 > 其它 >直接記憶體

直接記憶體

參考資料:尚矽谷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引數值一致