GC垃圾回收
gc=full gc +young gc
Java jvm 內存=堆內存+非堆內存
堆內存(-Xms-Xmx)=年輕代(-Xmn)+年老代
-Xms,初始分配內存,-Xmx最大分配內存,一般情況下設置成一樣的值
年輕代=Eden+s0+s1
非堆內存=持久代(-XX:PermSize -XX:MaxPermSize)+code cache(-XX:reservedcodecachesize)
-XX:PermSize(初始值大小)、-XX:MaxPermSize(最大值)
【jvm內存模型圖】
gc:自動檢測和釋放不再使用的內存。(垃圾回收)
Minor gc:頻率快是正常 ,也叫young gc
Major gc:盡可能讓他頻率少【重點關註】 ,也叫full gc
持久代(Perm):使用的class對象
Jvm的生命周期:①一個對象,首先放置在Eden區,結果發現需繼續使用,不能進入gc回收,則會放置在s區,s0和s1隨意。②如果放在s0區,過一段時間仍不能gc回收,則會放置在s1區③再過一段時間仍不能回收,則會存放在年老代區域。④在年老代存放很長時間後,可能被major gc回收,也可能繼續存活
Jvm內存參數設置
-Xms-Xmx設置為一樣的值,設置為可用內存的80%
-Xmn設置為堆內存的3/8
-XX:PermSize(默認為物理內存的1/64)、-XX:MaxPermSize(默認為物理內存的1/4)
Jvm公共參數配置
-server:服務器模式,一定要放在所有參數之前
-Xss:指定每個線程占的大小(建議不要超過1M)
-XX:SurvivorRatio:設置年輕代裏面Eden區和s區的大小比值
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=path_address:JVM崩潰的時候會打印出heap dump
-XX:+AggressiveOpts:啟用這個參數,則每當JDK版本升級時,你的JVM都會使用最新加入的優化技術(如果有的話)
-Djava.awt.headless=true
gc的類型
Serial GC:適用內存占用比較少的應用,性能最差
Parallel GC:年輕代多線程,年老代使用單線程
Parallel Old GC:年輕代和年老代都使用多線程收集垃圾
CMS:多線程並發回收垃圾,適用於不能忍受長時間停頓要求快速響應的應用,比較常用,最好和-XX:+UseParNewGC一同使用
-XX:+UseG1GC
gc相關參數
-XX: +DisableExplicitGC:禁止使用System.gc
-XX:+PrintGCTimeStamps -XX:+PrintGCDetails –Xloggc:<filename>打印gc回收的詳情日誌
-XX:+UseGCOverheadLimit:讓程序提前結束,達到預警目的
-XX:+UseCMSCompactAtFullCollection:對存活對象進行整理,使內存碎片減少
GC垃圾回收