JVM的四種垃圾收集器:
Serial收集器(常用於單CPU環境) -XX:+UseSerialGC
Throughput(Parallel)收集器 server級虛擬機,-XX:+UseParallel[Old]GC
Concurrent收集器 CMS:收集新生代 -XX:+UseParNewGC、-XX:+UseConcMarkSweepGC
G1收集器 --爲了處理處理超大堆時產生的停頓。 -XX:+UseG1GC
垃圾收集的兩步驟:
查找不再使用的對象
釋放這些對象所管理的內存
所有應用線程都停止運行所產生的停頓稱爲 時空停頓。這種停頓對應用的性能影響很大,調優垃圾收集時,儘量減少這種停頓是最爲關鍵的考量因素。
堆分爲 老年代,新生代;新生代又分爲Eden空間和Survivor空間。
選擇GC算法
取決於應用程序的特徵; 應用的性能目標
GC調優基礎
1 調整堆大小:
堆太小,程序大部分時間浪費在GC上;設置大,停頓時間會變長。
-Xms 初始值 -Xmx 最大值
2 代空間的調整
新生代分配過大,垃圾回收發生頻率就比較低,從新生代晉升到老年代的對象就更少,老年代就相對小。容易被頻繁觸發Full GC.
找到平衡點是解決問題的關鍵
所有調整代空間的命令行標誌調整都是新生代空間
-XX:NewRatio=N 新老空間佔用比率
-XX:NewSize=N 新生代初始大小
-XX:MaxNewSize=N 新生代空間最大大小
-XmnN 上面兩個設成同一個值
3 永久代和元空間的調整
-XX:PermSize=N 永久代大小
-XX:MaxPermSize=N
-XX:MetaspaceSize=N 元空間大小
-XX:MaxMetaspaceSize=N
4 控制併發
-XX:ParallelGCThreads=N 線程數
5 自適應調整
-XX:+PrintAdaptiveSizePolicy
垃圾回收工具
開啓GC的日誌功能: -verbose:gc -XX:+PrintGC -XX:+PrintGCDetails
-XX:+PringGCTimeStamps -XX:+PrintGCDateStamps
-Xloggc:filename
GC Histogram可以讀入GC日誌,更加日誌生成對應圖標和表格