JVM堆內存詳解

JVM堆內存 

1、JVM堆內存劃分 

java中最大的特色在於其具有良好的垃圾收集特性 
GC是整個java之中最重要的安全保證 
整個JVM中的GC的處理機制:對不須要的對象進行標記,然後進行清除 java


在JDK1.8以後,將最初的永久帶內存空間取消了,該圖爲JDK1.8以前的內存空間組成 安全

取消永久代目的是爲了將HotSpot於JRockit兩個虛擬機標準聯合爲一個 日誌

在整個JVM堆內存之中實際上將內存分爲了三部分cdn

  • 新生帶(年輕代):新對象和沒達到必定年齡的對象都在年輕代 
  • 老年代:被長時間使用的對象,老年代的內存空間應該要比年輕代更大 
  • 元空間(JDK1.8以前叫永久代):像一些方法中的操做臨時對象等,JDK1.8以前是佔用JVM內存,JDK1.8以後直接使用物理內存 

2、GC流程 

基本全部數據都會保存在JVM的堆內存之中 對象

對於整個的GC流程裏面,最須要處理的事年輕代與老年代的內存清理操做 blog

元空間(永久代)都不在GC範圍內 內存

具體流程: 

  1. 當如今有一個新的對象產生,JVM須要爲該對象進行內存空間的申請 
  2. 先判斷Eden區是否有內存空間,若是有,直接將新對象保存在Eden區 
  3. 若是Eden區的內存空間不足,會自動執行一個Minor GC操做,將Eden區的無用內存空間進行清理 
  4. 清理Eden區以後繼續判斷Eden區內存空間狀況,若是充足,則將新對象直接保存在Eden區
  5. 若是執行了Minor GC以後發現Eden區的內存依然不足,那就判斷存活區的內存空間,並將Eden區的部分活躍對象保存在存活區 
  6. 活躍對象遷移到存活區後,繼續判斷Eden區內存空間狀況,若是充足,則將新對象直接保存在Eden區 
  7. 若是存活區也沒有空間了,則繼續判斷老年區,若是老年區充足,則將存活區的部分活躍對象保存在老年區 
  8. 存活區的活躍對象遷移到老年區後,則將Eden區的部分活躍對象保存在存活區 
  9. 活躍對象遷移到存活區後,繼續判斷Eden區內存空間狀況,若是充足,則將新對象直接保存在Eden區 
  10. 若是老年區也滿了,這時候產生Major GC(Full GC)進行老年區的內存清理 
  11. 若是老年區執行了Major GC以後發現沒法進行對象保存,會產生OutOfMemoryError異常

3、堆內存參數調整(調優關鍵) 

  • 實際上每一塊子內存區中都會存在有一部分的可變伸縮區 
  • 若是空間不足時,則在可變範圍以內擴大內存空間 
  • 當一段時間後,內存空間有餘,再將可變空間進行釋放 


堆內存空間調整參數 

  • -Xms:設置初始分配大小,默認爲物理內存的1/64 
  • -Xmx:最大分配內存,默認爲物理內存的1/4
  • -XX:+PrintGCDetails:輸出詳細的GC處理日誌 
  • -XX:+PrintGCTimeStamps:輸出GC的時間戳信息 
  • -XX:+PrintGCDateStamps:輸出GC的時間戳信息(以日期的形式)
  • -XX:+PrintHeapAtGC:在GC進行處理的先後打印堆內存信息 
  • -Xloggc:(SavePath):設置日誌信息保存文件 
  • 在堆內存的調整策略中,基本上只要調整兩個參數:-Xms和-Xmx 

最後

歡迎你們有興趣的能夠關注個人公衆號【java小瓜哥的分享平臺】,文章都會在裏面更新,還有各類java的資料都是免費分享的。但願與你們一塊兒進步努力!虛擬機

相關文章
相關標籤/搜索