直接內(nèi)存(Direct Memory)并不是虛擬機運行時數(shù)據(jù)區(qū)的一部分,也不是Java虛擬機規(guī)范中定義的內(nèi)存區(qū)域,但是這部分內(nèi)存也被頻繁地使用,而且也可能導致OutOfMemoryError異常出現(xiàn)。
JDK1.4加的NIO中,ByteBuffer有個方法是allocateDirect(int capacity) ,這是一種基于通道(Channel)與緩沖區(qū)(Buffer)的I/O方式,它可以使用Native函數(shù)庫直接分配堆外內(nèi)存,然后通過一個存儲在 Java堆里面的DirectByteBuffer對象作為這塊內(nèi)存的引用進行操作。這樣能在一些場景中顯著提高性能,因為避免了在Java堆和 Native堆中來回復制數(shù)據(jù)。
顯然,本機直接內(nèi)存的分配不會受到Java堆大小的限制,但是,既然是內(nèi)存,則肯定還是會受到本機總內(nèi)存(包括RAM及SWAP區(qū)或者分頁文件)的大小及處理器尋址空間的限制。服務器管理員配置虛擬機參數(shù)時,一般會根據(jù)實際內(nèi)存設置-Xmx等參數(shù)信息,但經(jīng)常會忽略掉直接內(nèi)存,使得各個內(nèi)存區(qū)域的總和大于物理內(nèi)存限制(包括物理上的和操作系統(tǒng)級的限制),從而導致動態(tài)擴展時出現(xiàn)OutOfMemoryError異常。
2015職稱計算機考試書PowerPoint2007中 .. 定價:¥45 優(yōu)惠價:¥42 更多書籍 | |
2015年全國職稱計算機考試教材(2007模 .. 定價:¥225 優(yōu)惠價:¥213 更多書籍 |