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