JVM堆內存
1、JVM堆內存劃分
java中最大的特色在於其具有良好的垃圾收集特性
GC是整個java之中最重要的安全保證
整個JVM中的GC的處理機制:對不須要的對象進行標記,然後進行清除 java
![](http://static.javashuo.com/static/loading.gif)
在JDK1.8以後,將最初的永久帶內存空間取消了,該圖爲JDK1.8以前的內存空間組成 安全
取消永久代目的是爲了將HotSpot於JRockit兩個虛擬機標準聯合爲一個 日誌
在整個JVM堆內存之中實際上將內存分爲了三部分cdn
- 新生帶(年輕代):新對象和沒達到必定年齡的對象都在年輕代
- 老年代:被長時間使用的對象,老年代的內存空間應該要比年輕代更大
- 元空間(JDK1.8以前叫永久代):像一些方法中的操做臨時對象等,JDK1.8以前是佔用JVM內存,JDK1.8以後直接使用物理內存
2、GC流程
基本全部數據都會保存在JVM的堆內存之中 對象
對於整個的GC流程裏面,最須要處理的事年輕代與老年代的內存清理操做 blog
元空間(永久代)都不在GC範圍內
內存
具體流程:
- 當如今有一個新的對象產生,JVM須要爲該對象進行內存空間的申請
- 先判斷Eden區是否有內存空間,若是有,直接將新對象保存在Eden區
- 若是Eden區的內存空間不足,會自動執行一個Minor GC操做,將Eden區的無用內存空間進行清理
- 清理Eden區以後繼續判斷Eden區內存空間狀況,若是充足,則將新對象直接保存在Eden區
- 若是執行了Minor GC以後發現Eden區的內存依然不足,那就判斷存活區的內存空間,並將Eden區的部分活躍對象保存在存活區
- 活躍對象遷移到存活區後,繼續判斷Eden區內存空間狀況,若是充足,則將新對象直接保存在Eden區
- 若是存活區也沒有空間了,則繼續判斷老年區,若是老年區充足,則將存活區的部分活躍對象保存在老年區
- 存活區的活躍對象遷移到老年區後,則將Eden區的部分活躍對象保存在存活區
- 活躍對象遷移到存活區後,繼續判斷Eden區內存空間狀況,若是充足,則將新對象直接保存在Eden區
- 若是老年區也滿了,這時候產生Major GC(Full GC)進行老年區的內存清理
- 若是老年區執行了Major GC以後發現沒法進行對象保存,會產生OutOfMemoryError異常
3、堆內存參數調整(調優關鍵)
- 實際上每一塊子內存區中都會存在有一部分的可變伸縮區
- 若是空間不足時,則在可變範圍以內擴大內存空間
- 當一段時間後,內存空間有餘,再將可變空間進行釋放
![](http://static.javashuo.com/static/loading.gif)
堆內存空間調整參數
- -Xms:設置初始分配大小,默認爲物理內存的1/64
- -Xmx:最大分配內存,默認爲物理內存的1/4
- -XX:+PrintGCDetails:輸出詳細的GC處理日誌
- -XX:+PrintGCTimeStamps:輸出GC的時間戳信息
- -XX:+PrintGCDateStamps:輸出GC的時間戳信息(以日期的形式)
- -XX:+PrintHeapAtGC:在GC進行處理的先後打印堆內存信息
- -Xloggc:(SavePath):設置日誌信息保存文件
- 在堆內存的調整策略中,基本上只要調整兩個參數:-Xms和-Xmx
最後
歡迎你們有興趣的能夠關注個人公衆號【java小瓜哥的分享平臺】,文章都會在裏面更新,還有各類java的資料都是免費分享的。但願與你們一塊兒進步努力!虛擬機