前言
本文記錄下筆者學習jvm後了解的參數,以供大家參考
JVM參數
- -XX:InitialHeapSize=100M 初始化堆大小 簡寫-Xms100M
- -XX:MaxHeapSize=100M 最大堆大小 簡寫-Xms100M
- -XX:ThreadStackSize=100M 設定每個線程的堆棧大小 簡寫-Xss100M
- -XX:+PrintFlagsFinal:列印所有參數,設定了會顯示設定後的參數值
- -XX:+HeapDumpOnOutOfMemoryError 啟動堆記憶體溢出列印當JVM堆記憶體發生溢出時,也就是OOM,自動生成dump檔案
- -XX:HeapDumpPath=E:\error/heapdump.hprof 指定堆記憶體溢出列印目錄 表示在目前目錄生成一個heap.hprof檔案
- -XX:NewSize=20M 設定年輕代的大小
- -XX:MaxNewSize=50M 年輕代最大大小
- -XX:OldSize=50M 設定老年代大小
- -XX:MetaspaceSize=50M 設定方法區大小
- -XX:MaxMetaspaceSize=50M 方法區最大大小
- -XX:+UseParallelGC 使用UseParallelGC 新生代,吞吐量優先
- -XX:+UseParallelOldGC 使用UseParallelOldGC 老年代,吞吐量優先
- -XX:+UseConcMarkSweepGC 使用CMS 老年代,停頓時間優先
- -XX:+UseG1GC 使用G1GC 新生代,老年代,停頓時間優先
- -XX:NewRatio 新老生代的比值,比如-XX:Ratio=4,則表示新生代:老年代=1:4,也就是新生代占整個堆記憶體的1/5(預設新生代占1/3,沒有特殊需求不需要改)
- -XX:SurvivorRatio 兩個S區和Eden區的比值比如-XX:SurvivorRatio=8,也就是(S0+S1):Eden=2:8,也就是一個S占整個新生代的1/10
- -XX:+PrintGCDateStamps Xloggc:$CATALINA_HOME/logs/gc.log 列印出GC日志 可以使用不同的垃圾收集器,對比檢視GC情況
以上就是一些相對常用的指令,JVM調優最常見的就是去調整堆大小,也就是根據應用情況來設定-Xmx和-Xms,建議是-Xmx和-Xms設定相同的值,避免初始化堆大小不斷的擴大和縮小導緻開銷
JVM分析工具
jdk預設提供了一些可以用來分析jvm運作情況的工具,具體有以下指令可以使用
- jps:檢視目前java程序
-
jinfo:檢視或者修改jvm參數,如jinfo -flag UseG1GC PID、jinfo -flag MaxHeapSize
PID, 修改參數必須是-XX:PrintFlagsFinal列印的參數類型是manageable的,不推薦使用。修改參數建議在啟動指令加參數
- jstat:檢視目前程序的内部資訊, 如jstat -class PID 1000 10:查詢class資訊,每個一秒輸出1次,輸出10次 如jstat -gc PID 1000 10:查詢gc資訊,每個一秒輸出1次,輸出10次
- jstack PID:查詢目前線程的堆棧資訊,可以排查死鎖等,會有資訊提示檢測到死鎖
- jmap生成堆記憶體的快照:檢視目前資訊:jmap -heap PID,下載下傳:jmap -dump:format=b,file=heap.hprof PID
- jconsole:檢視jmap下載下傳的快照檔案
- jvisualvm:也是檢視jmap下載下傳的快照檔案,比jconsole要好用,安裝visual gc檢視圖形