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日志,更加日志生成對應圖示和表格