直接內(nèi)存(Direct Memory)
概述
●?不是虛擬機運行時數(shù)據(jù)區(qū)的一部分奏夫,也不是《Java虛擬機規(guī)范》中定義的內(nèi)存區(qū)域。
●?直接內(nèi)存是在Java堆外的蝌焚、直接向系統(tǒng)申請的內(nèi)存區(qū)間移剪。來源于NIO,通過存在堆中的DirectByteBuffer操作Native內(nèi)存
●?通常瓤摧,訪問直接內(nèi)存的速度會優(yōu)于Java堆竿裂。即讀寫性能高。
???因此出于性能考慮姻灶,讀寫頻繁的場合可能會考慮使用直接內(nèi)存铛绰。
???Java的NIO庫允許Java程序使用直接內(nèi)存,用于數(shù)據(jù)緩沖區(qū)产喉。
●?也可能導(dǎo)致0utOfMemoryError異常
●?由于直接內(nèi)存在Java堆外捂掰,因此它的大小不會直接受限于- Xmx指定的最大堆大小,但是系統(tǒng)內(nèi)存是有限的曾沈,Java堆和直接內(nèi)存的總和依然受限于操作系統(tǒng)能給出的最大內(nèi)存这嚣。
●?缺點
???分配回收成本較高
???不受JVM內(nèi)存回收管理
●?直接內(nèi)存大小可以通過MaxDi rectMemorySize設(shè)置如果不指定,默認與堆的最大值-Xmx參數(shù)值一致
非直接緩沖區(qū)
讀寫文件塞俱,需要與磁盤交互姐帚,需要由用戶態(tài)切換到內(nèi)核態(tài)。在內(nèi)核態(tài)時障涯,需要內(nèi)存如右
圖的操作罐旗。
使用IO膳汪,見下圖。這里需要兩份內(nèi)存存儲重復(fù)數(shù)據(jù)九秀,效率低遗嗽。
直接緩沖區(qū)
使用NIO時,如下圖鼓蜒。操作系統(tǒng)劃出的直接緩存區(qū)可以被java
代碼直接訪問痹换,只有一份。NIO適合對大文件的讀寫操作都弹。
簡單理解:
java process memory = java heap + native memory