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

直接記憶體 Direct Memory

直接記憶體 Direct Memory

不是虛擬機器執行時資料區的一部分,也不是《Java虛擬機器規範》中定義的記憶體區域。

直接記憶體是在Java堆外的、直接向系統申請的記憶體區間。

來源於NIO,通過存在堆中的DirectByteBuffer操作Native記憶體

通常,訪問直接記憶體的速度會優於Java堆。即讀寫效能高。

  • 因此出於效能考慮,讀寫頻繁的場合可能會考慮使用直接記憶體。
  • Java的NIO庫允許Java程式使用直接記憶體,用於資料緩衝區

使用下列程式碼,直接分配本地記憶體空間

int BUFFER = 1024*1024*1024; // 1GB
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(BUFFER);

非直接快取區和快取區

原來採用BIO的架構,我們需要從使用者態切換成核心態

NIO的方式使用了快取區的概念

存在的問題

也可能導致outofMemoryError異常

由於直接記憶體在Java堆外,因此它的大小不會直接受限於-xmx指定的最大堆大小,但是系統記憶體是有限的,Java堆和直接記憶體的總和依然受限於作業系統能給出的最大記憶體。
缺點

  • 分配回收成本較高
  • 不受JVM記憶體回收管理

直接記憶體大小可以通過MaxDirectMemorySize設定

如果不指定,預設與堆的最大值-xmx引數值一致