堆內(nèi)內(nèi)存(on-heap memory)完全遵守JVM虛擬機(jī)的內(nèi)存管理機(jī)制,堆內(nèi)內(nèi)存 = 新生代+老年代+持久代,我們采用垃圾回收器(GC)統(tǒng)一進(jìn)行內(nèi)存管理,平時(shí)GC會(huì)去頻繁的回收新生代的對(duì)象,也就是minor GC.然后GC會(huì)在某些特定的時(shí)間點(diǎn)進(jìn)行一次徹底回收,也就是Full GC,GC會(huì)對(duì)所有分配的堆內(nèi)內(nèi)存進(jìn)行掃描,在這個(gè)過(guò)程中會(huì)對(duì)JAVA應(yīng)用程序的性能造成一定影響,還可能會(huì)產(chǎn)生Stop The World。
我們?cè)趈vm參數(shù)中只使用-Xms,-Xmx等參數(shù)就可以設(shè)置堆的大小和最大值,和堆內(nèi)內(nèi)存相對(duì)應(yīng),堆外內(nèi)存就是把內(nèi)存對(duì)象分配在Java虛擬機(jī)的堆以外的內(nèi)存,這些內(nèi)存直接受操作系統(tǒng)管理(而不是虛擬機(jī)),這樣做的結(jié)果就是能夠在一定程度上減少垃圾回收對(duì)應(yīng)用程序造成的影響。
我們經(jīng)常用java.nio.DirectByteBuffer對(duì)象進(jìn)行堆外內(nèi)存的管理和使用,它會(huì)在對(duì)象創(chuàng)建的時(shí)候就分配堆外內(nèi)存.DirectByteBuffer類(lèi)是在Java Heap外分配內(nèi)存,對(duì)堆外內(nèi)存的申請(qǐng)主要是通過(guò)成員變量unsafe來(lái)操作