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