天天看點

JAVA性能權威指南2-垃圾收集

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

垃圾收集算法

繼續閱讀