4.Sun HotSpot 垃圾回收器
概述
當永久代和舊生代出發GC時,除CMS外都會發生Full GC
- 首先按照 新生代配置的GC,發生Mintor GC
- 再按照舊生代配置的GC,對舊生代和永久代GC
- 若JVM 對Mintor GC後可能會發生晉升失敗,則直接採用舊生代配置的GC對Young,old,Perm進行GC.
一些術語解釋
圖1
圖2
新生代可用GC
均使用複製算法,原理一樣。
- 拷貝eden和from中的存活對象到to中;
- 部分對象由於某些原因直接晉升到old中;
- 清空eden、from,from和to交換下身份,直到下一次GC發生
分配對象時,Eden區內存不足時觸發
Serial Copying
特性
serial (串行),stop-the-world
適用場景
- 單cpu,新生代小,對暫時時間要求不高的
- client級別或32位window上默認選擇
直接分配到old的規則
- 對象大小超過eden space
- 大對象(PretenureSizeThreadold)晉升old
晉升規則
- 經歷多次Mintor GC 仍存活的對象
- To Survivor滿或空間不足,直接晉升
ParNew
特性
- 可以認爲是Serial Copying的多線程版本
- 可搭配CMS(Concurrent Mark Sweep)
- 不可搭配Parallel old
ParNew Scavenge
特性
- Parallel Stop-the-world
- 並行默認參數
cpu核數<=8:=cpu核數
cpu核數>8:=(3+cpu核心*5)/8
- 調節策略(GC Ergonomics)
會根據Mintor GC頻率、時間動態的調整Eden\S0\S1大小,可以消除特性(-XX:UseAdaptiveSizePolicy)
適用場景
- 多cpu,暫停較短的應用
- server級別,2核2G 機器上的默認選擇
直接分配到old的規則
- 在TLAB和Eden上分配失敗,對象大小大於Eden的一半
- PretenureSizeThreadold 參數無效
晉升規則
- 經歷多次Mintor GC仍存活對象
- To Survivor內存滿的對象直接晉升
舊生代可用的GC
Serial old(Serial MSC)
特性
- Serial、Stop-the-world
- 使用算法Mark-Sweep-Compact
- 由於是單線程,可能造成GC暫停時間可能會很長,可使用-XX:PrintGCApplicationStoppedTime查看暫停時間
適用場景
- client級別或32位window上默認選擇
Parallel old(Parallel compacting)
特性
- Parallel、Stop-the-world
- 使用算法:Mark-compact
算法描述圖:
適用場景
- 多cpu,暫停較短的應用
- server級別,2核2G 機器上的默認選擇
CMS(Concurrent Mark Sweep)
特性
- Parallel、Concurrent
- 使用算法:Mark-sweep
算法描述圖:
- 縮短GC暫停時間,比較複雜,GC總時間增加
- 默認併發數=(處理器核心數+3)/4,也可以用-XX:ParallelCMSThreads=2
- Prem Generation也可以啓用CMS,-XX:+CMSPermSweepingEnabled,-XX:+CMSClassUnloadingEnabled
適用場景
- 短暫回收停頓時間,服務響應速度快的應用,尤其是互聯網或基於B/S系統的服務上
缺點
- 搶佔應用CPU
- GC耗時長
- 浮動垃圾
- 內存碎片
- Mintor GC耗時長,每次promotion提升都搜索free-list
組合
標準
吞吐量(throughput)=應用時間/總時間 關注耗時時間
暫停時間(Latency)關注每次GC造成的暫停
組合選擇
- 單cpu或小內存,單機程序
-XX:+UseSerialGC
- 多cpu,需要大吞吐量,如計算型應用
-XX:+UseParallerGC或 -XX:+UseParallerOldGC
- 多cpu,追求停頓時間短,需要響應速度快的互聯網應用
-XX:+UseConcMarkSweepGC -XX:ParNewGC
自動選擇GC方式
- 吞吐量優先
-XX:GCTimeRatio=n
- 暫停時間短
-XX:MaxGCPauseMillis=n
- 一般不用
調優
堆大小的調優
- 堆越大越好
降低GC頻率,單過大可能增加單次GC時間
對象更有可能成爲垃圾
- 受硬件和系統的限制
32位操作系統單個進程最大可用內存2G,64無限
New和Old的比例
- 參數
-Xms=1024MB
-Xmx=1024MB
堆每次調整就會出發Full GC,避免調整可設置-Xms=-Xmx
新生代調優
- 增大Eden的大小
降低GC的頻率
不一定會增大Mintor GC的時間
Mintor GC耗時與要拷貝的對象(存活對象多少成正比)
- 參數
-XX:NewSzie1024MB 新生代初始化大小
-XX:MaxNewSzie=1024MB 新生代最大大小
-XX:NewReatio=m New和Old比值
-Xmn=1024MB 新生代大小 (一般使用這個固定新生代大小)
新生代晉升
- 儘可能的讓對象呆在Survivor中,是新生代收回
- 避免長時間存活對象在Survivor中不必要的拷貝
- 不容易找平衡點:better copy more ,than promote more
- -XX:SurvivorRatio=m Eden和Survivor比值
- 對象晉升年齡的閥值:Tenuring Threshold
舊生代調優
- 儘可能調優新生代
- 在不緊的的時間段手動Full GC
- 大小平衡
太大 GC時間長 太小 GC頻率高
- 硬件優化
- 程序優化,避免無用對象在oldko空間
監控工具
- JVM參數
-XX:+PrintGC(JDK8) 查看GC基本信息
-XX:+PrintGCDetail (JDK8) 查看GC詳細信息
-XX:+PrintGCTimeStamps (JDK8) 查看GC過程用戶線程併發時間
-XX:+PrintGCApplicationStoppedTime (JDK8)查看GC過程用戶線程併發時間暫停時間
-Xlogg:c:/../xx.log 輸出文件
- 命令行工具
查看內存使用情況,head dump:jmap+jhat
查看GC情況:jstat
JConsole:Java監視與管理控制檯
JConsole(Java Monitoring and Management Console)是一種基於JMX的可視化監視、管理工
具。它管理部分的功能是針對JMX MBean進行管理,由於MBean可以使用代碼、中間件服務器
的管理控制檯或者所有符合JMX規範的軟件進行訪問。
VisualVM:多合一故障處理工具
VisualVM(All-in-One Java Troubleshooting Tool)是到目前爲止隨JDK發佈的功能最強大
的運行監視和故障處理程序。VisualVM的還有一個很大的優點:不需要被監視的程序基於特殊
Agent運行,因此它對應用程序的實際性能的影響很小,使得它可以直接應用在生產環境
JMC,Oracle Java Mission Control 是一個用於對 Java 應用程序進行管理、監視、概要分析和
故障排除的工具套件。首次安裝時,Java Mission Control 包括 JMX 控制檯和 Java 飛行記錄器。
從 Mission Control 中可以輕鬆安裝更多插件
Eclipse EMemoryAnalyzer