1. 程式人生 > >學習筆記 --- JVM 堆外記憶體(off-heap)、堆內記憶體(on-heap)

學習筆記 --- JVM 堆外記憶體(off-heap)、堆內記憶體(on-heap)

堆內記憶體(on-heap)

Java中分配的非空物件都是由Java虛擬機器的垃圾收集器管理的,也稱為堆內記憶體(on-heap memory)。虛擬機器會定期對垃圾記憶體進行回收,在某些特定的時間點,它會進行一次徹底的回收(full gc)。徹底回收時,垃圾收集器會對所有分配的堆內記憶體進行完整的掃描,這意味著一個重要的事實——這樣一次垃圾收集對Java應用造成的影響,跟堆的大小是成正比的。過大的堆會影響Java應用的效能。
對於對內記憶體效率問題:一種解決方案就是使用堆外記憶體(off-heap memory)

堆外記憶體(off-heap)

堆外記憶體意味著把記憶體物件分配在Java虛擬機器的堆以外的記憶體,這些記憶體直接受作業系統管理(而不是虛擬機器)

。這樣做的結果就是能保持一個較小的堆,以減少垃圾收集對應用的影響。使用堆外記憶體能夠降低GC導致的暫停

  • 對於大記憶體有良好的伸縮性
  • 對垃圾回收停頓的改善可以明顯感覺到
  • 在程序間可以共享,減少虛擬機器間的複製

問題:

資料結構變得不那麼直觀,如果資料結構比較複雜,就要對它進行序列化(serialization),而序列化本身也會影響效能

應用場景:

冷資料,短期內不用的資料可以暫時放在堆外記憶體中

  • Session會話快取,儲存不啟用的使用者session,比如使用者沒有正常退出,我們也無法確定他會不會短時間內再回來,將其會話存到堆外記憶體。一旦再次登入,無需訪問資料庫可再次啟用
  • 計算結果的快取,如Spark的堆外記憶體的使用
  • 大量查詢的結果等,擊中率比較低的都可以遷移到堆外。

參考:

https://www.jdon.com/46066

https://blog.csdn.net/u010722938/article/details/51558315