直接記憶體 Direct Memory
阿新 • • 發佈:2021-06-30
直接記憶體 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引數值一致