堆內內存:
1.一般情況下,一個新的對象創建在JVM內的堆上,併爲其分配內存空間。堆空間由JVM垃圾回收器管理,稱爲堆內內存(on-heap memory)
2.虛擬機會定期對垃圾內存進行回收,有時會進行一次徹底的回收Full GC
3.徹底回收時,垃圾收集器會對所有分配的堆內內存進行完整的掃描,這意味一次垃圾收集對Java 應用造成的影響,跟堆的大小是成正比的,過大的堆會影響 Java 應用的性能
堆外內存:
1.和堆內內存相對應,堆外內存就是把內存對象分配在Java虛擬機的堆以外的內存,這些內存直接受操作系統管理,而不是虛擬機
2.這樣能夠維護一個較小的堆,在一定程度上減少垃圾回收對應用程序造成的影響,堆外內存也被稱爲直接內存
3.可以使用NIO包下的DirectByteBuffer進行堆外內存的管理和使用,它會在對象創建的時候就分配堆外內存
堆外內存的優點:
1、保持了一個較小的堆內內存,可以減少垃圾收集對應喲的影響。
2、在使用緩存時,需要消耗一些內存空間來提升速度,使用堆內內存會給虛擬機帶來GC壓力,使用硬盤或者分佈式緩存的響應時間會比較長,這時候堆外緩存會是一個比較好的選擇。
3、堆內內存由JVM 管理,屬於用戶態,而堆外內存由操作系統管理,屬於內核態。如果從堆內向磁盤些數據時,數據會被先複製到堆外內存,即內核緩衝區,然後再由操作系統寫入磁盤。使用堆外內存,直接寫入磁盤,提升了效率。
堆外內存的缺點:
1、堆外內存的缺點就是內存難以控制。
2、使用堆外內存就間接失去了使用JVM管理內存的可能性,一旦發生內存溢出時排查起來非常困難。
堆外內存泄露:
堆外內存泄露的干預方法:
堆外內存回收過程:
總結: