1. 程式人生 > >JVM基礎教程

JVM基礎教程

JVM的引數型別

標準引數

java -version

-help
-server
-client
-version -showversion
-cp -classpath

X引數

非標準化引數
-Xint:解釋執行
-Xcomp:第一次使用就編譯成原生代碼
-Xmixed:混合模式,JVM自己來決定是否編譯成原生代碼

java -Xint -version

XX引數

非標準化引數,相對不穩定,主要用於JVM調優和Debug
XX引數分類
Boolean型別
格式:-XX[±]<\name>表示啟用或者禁用name屬性
比如:
-XX:+UseConcMarkSweepGC
-XX:+UseG1GC
比如:
非Boolean型別
格式:-XX:<\name>=<\value>表示name屬性的值是value
比如:
-XX:MaxGCPauseMillis=500
-XX:GCTimeRatio=19

-Xmx 和 -Xms不是X引數,而是XX引數
-Xms等價於-XX:InitialHeapSize
-Xmx等價於-XX:MaxHeapSize

各種引數

-XX:+PrintGC 使用這個引數,虛擬機器啟動後,只要遇到GC就會列印日誌
-XX:+PrintGCDetails 可以檢視詳細資訊,包括各個區的情況
-XX:+PrintGCTimeStamps 列印GC發生的時間戳
-Xloggc:log/gc.log 指定GC log的位置,幫助開發人員分析問題
-XX:+PrintHeapAtGC 每次GC時,列印堆資訊
-XX:+TraceClassLoading 監控類的載入
-XX:+UseSerialGC 配置序列回收器
-Xms 設定java程式啟動時初始堆大小(最小堆)
-Xmx 設定java程式能獲得的最大堆大小
-Xmx20m -Xms5m -XX:+PrintCommandLineFlags 可以將隱式或者顯式傳給虛擬機器的引數輸出
-XX:+HeapDumpOnOutOfMemoryError OOM時匯出堆到檔案
-XX:+HeapDumpPath 匯出OOM的路徑

-XX:OnOutOfMemoryError
在OOM時,執行一個指令碼
可以在OOM時,傳送郵件,甚至是重啟程式

新生代的設定

-Xmn:可以設定新生代的大小,設定一個比較大的新生代的大小會減少老年代的大小,這個引數對系統性能以及GC行為有很大的影響,新生代大小一般會設定整個堆空間的1/3到1/4左右
-XX:SurvivoRatio:用來設定新生代中eden空間和from/to空間的比例。含義:-XX:SurvivoRatio=eden/from=eden/to
-XX:SurvivoRatio:設定兩個Survivor區和eden的比
8表示兩個Survivor:eden=2:8,即一個Survivor佔年輕代的1/10

總結:不同的堆分佈情況,對系統執行會產生一定的影響,在實際工作中,應該根據系統的特點做出合理的配置,基本策略:儘可能將物件預留在新生代,減少老年代的GC次數。

除了可以設定新生代的絕對大小(-Xmn),還可以使用(-XX:NewRatio)設定新生代和老年代的比例:-XX:NewRatio=老年代/新生代
-XX:NewRatio 新生代(eden+2*s)和老年代(不包含永久區)的比值
4表示 新生代:老年代=1:4,即年輕代佔堆的1/5

永久區的設定

-XX:PermSize 設定永久區的初始空間
-XX:MaxPermSize 設定永久區的最大空間

  1. 根據實際情況調整新生代和倖存代的大小
  2. 官方推薦新生代佔堆的3/8
  3. 倖存代佔新生代的1/10
  4. 在OOM是,記得Dump出堆,確保可以排查現場問題

jstat檢視JVM統計資訊

27696埠每隔1秒輸出一次GC資訊,總共輸出10次

jstat -gc 27696 1000 10
  1. 類裝載
  2. 垃圾收集

S0C,S1C,S0U,S1U : S0和S1的總量與使用量
EC,EU : Eden區總量與使用量
OC,OU : Old區總量與使用量
MC,MU : Metaspace區的總量與使用量
CCSC,CCSU : 壓縮類空間總量與使用量
YGC,YGCT : YoungGC的次數與時間
FGC,FGCT : FullGCd的次數與實踐

  1. JIT編譯
    -compiler -printcompilation

GC演算法與種類

GC的概念

Garbage Collection垃圾收集
1960年,Lisp使用了GC
Java中,GC的物件是堆空間和永久區

參考部落格