Yige

Yige

Build

JVM系列-JVM調優

JVM 系列 - JVM 調優#

依賴 JDK8,內容整理自:

  1. Jvm 系列 (四) 調優 - 命令篇
  2. JVM 調優常用參數配置
  3. Oracle JVM 官方鏈接

GC 日誌格式#

圖片引用自 Jvm 系列 (八) 知識點總覽

Young GC 日誌:
image.png

Full GC 日誌:
image.png

JVM 調優命令#

jps#

命令格式:
jps [options] [hostid]
option 參數

  • -l : 輸出主類全名或 jar 路徑
  • -q : 只輸出 LVMID
  • -m : 輸出 JVM 啟動時傳遞給 main () 的參數
  • -v : 輸出 JVM 啟動時顯示指定的 JVM 參數

[option]、[hostid] 參數也可以不寫

示例

$ jps -l -m
  28920 org.apache.catalina.startup.Bootstrap start
  11589 org.apache.catalina.startup.Bootstrap start
  25816 sun.tools.jps.Jps -l -m

jstat#

命令格式
jstat [option] LVMID [interval] [count]
參數

  • [option] : 操作參數
  • LVMID : 本地虛擬機進程 ID
  • [interval] : 連續輸出的時間間隔
  • [count] : 連續輸出的次數

option 參數詳解#

image.png

-class#

監視類裝載、卸載數量、總空間以及耗費的時間

$ jstat -class 11589
 Loaded  Bytes  Unloaded  Bytes     Time
  7035  14506.3     0     0.0       3.67
  • Loaded : 加載 class 的數量
  • Bytes : class 字節大小
  • Unloaded : 未加載 class 的數量
  • Bytes : 未加載 class 的字節大小
  • Time : 加載時間
-compiler#

輸出 JIT 編譯過的方法數量耗時等

$ jstat -compiler 1262
Compiled Failed Invalid   Time   FailedType FailedMethod
    2573      1       0    47.60          1 org/apache/catalina/loader/WebappClassLoader findResourceInternal
  • Compiled : 編譯數量
  • Failed : 編譯失敗數量
  • Invalid : 無效數量
  • Time : 編譯耗時
  • FailedType : 失敗類型
  • FailedMethod : 失敗方法的全限定名
-gc#

垃圾回收堆的行為統計,常用命令

$ jstat -gc 1262
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
22016.0 21504.0 15436.2  0.0   305664.0 90988.0   699392.0   15828.7   31024.0 30336.3 3632.0 3507.6     12    0.438   1      0.045    0.483
  • C 即 Capacity 總容量,U 即 Used 已使用的容量

  • S0C : survivor0 區的總容量

  • S1C : survivor1 區的總容量

  • S0U : survivor0 區已使用的容量

  • S1U : survivor1 區已使用的容量

  • EC : Eden 區的總容量

  • EU : Eden 區已使用的容量

  • OC : Old 區的總容量

  • OU : Old 區已使用的容量

  • MC : Metacspace 元空間容量

  • MU : Metacspace 元空間使用的容量

  • CCSC : 壓縮類空間容量

  • CCSU : 壓縮類空間已使用容量

  • YGC : 新生代垃圾回收次數

  • YGCT : 新生代垃圾回收時間

  • FGC : 老年代垃圾回收次數

  • FGCT : 老年代垃圾回收時間

  • GCT : 垃圾回收總消耗時間

-gccapacity#

同 - gc,不過還會輸出 Java 堆各區域使用到的最大、最小空間

$ jstat -gccapacity 1262
  NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC
349184.0 349184.0 349184.0 22016.0 21504.0 305664.0   699392.0   699392.0   699392.0   699392.0      0.0 1077248.0  31024.0      0.0 1048576.0   3632.0     12     1
  • NGCMN : 新生代佔用的最小空間
  • NGCMX : 新生代佔用的最大空間
  • NGC : 當前新生代容量
  • EC : 當前新生代 Eden 區容量
  • OGCMN : 老年代佔用的最小空間
  • OGCMX : 老年代佔用的最大空間
  • OGC:當前年老代的容量 (KB)
  • OC:當前年老代的空間 (KB)
  • MCMN : metaspace 元空間佔用的最小空間
  • MCMX : metaspace 元空間佔用的最大空間
  • MC : 當前 metaspace 元空間的容量
  • CCSMN : Compressed class space 佔用的最小空間
  • CCSMX : Compressed class space 佔用的最大空間
  • CCSC : Compressed class space 的容量
-gcutil#

同 - gc,不過輸出的是已使用空間占總空間的百分比

$ jstat -gcutil 28920
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
 12.45   0.00  33.85   0.00   4.44  4       0.242     0    0.000    0.242
-gccause#

垃圾收集統計概述(同 - gcutil),附加最近兩次垃圾回收事件的原因

$ jstat -gccause 28920
  S0     S1     E      O      P       YGC     YGCT    FGC    FGCT     GCT    LGCC                 GCC
 12.45   0.00  33.85   0.00   4.44      4    0.242     0    0.000    0.242   Allocation Failure   No GC
  • LGCC:最近垃圾回收的原因
  • GCC:目前垃圾回收的原因
-gcnew#

統計新生代的行為

$ jstat -gcnew 28920
 S0C      S1C      S0U        S1U  TT  MTT  DSS      EC        EU         YGC     YGCT
 419392.0 419392.0 52231.8    0.0  6   6    209696.0 3355520.0 1172246.0  4       0.242
  • TT:Tenuring threshold (提升閾值,晉升到老年代所需年齡)
  • MTT:最大的 tenuring threshold
  • DSS:survivor 區域大小 (KB)
-gcnewcapacity#

新生代與其相應的內存空間的統計

$ jstat -gcnewcapacity 28920
  NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC        YGC   FGC
 4194304.0  4194304.0  4194304.0 419392.0 419392.0 419392.0 419392.0  3355520.0  3355520.0     4     0
  • NGC: 當前年輕代的容量 (KB)
  • S0CMX: 最大的 S0 空間 (KB)
  • S0C: 當前 S0 空間 (KB)
  • ECMX: 最大 eden 空間 (KB)
  • EC: 當前 eden 空間 (KB)
-gcold#

統計舊生代的行為

$ jstat -gcold 28920
   PC       PU        OC           OU       YGC    FGC    FGCT     GCT
1048576.0  46561.7   6291456.0     0.0      4      0      0.000    0.242
-gcoldcapacity#

統計舊生代的大小和空間

$ jstat -gcoldcapacity 28920
   OGCMN       OGCMX        OGC         OC         YGC   FGC    FGCT     GCT
  6291456.0   6291456.0   6291456.0   6291456.0     4     0    0.000    0.242
-gcmetacapacity#

metaspace 元空間行為統計

$ jstat -gcmetacapacity 3491
   MCMN       MCMX        MC       CCSMN      CCSMX       CCSC     YGC   FGC    FGCT     GCT
       0.0  1077248.0    31024.0        0.0  1048576.0     3632.0    12     1    0.045    0.483
-printcompilation#

hotspot 編譯方法統計

$ jstat -printcompilation 28920
    Compiled  Size  Type Method
    1291      78     1    java/util/ArrayList indexOf
  • Compiled:被執行的編譯任務的數量
  • Size:方法字節碼的字節數
  • Type:編譯類型
  • Method:編譯方法的類名和方法名。類名使用”/” 代替 “.” 來作為空間分隔符。方法名是給出類的方法名。格式是一致於 HotSpot - XX:+PrintComplation 參數

jmap#

jmap (JVM Memory Map) 命令用於生成 heap dump 文件,如果不使用這個命令,還可以使用 - XX:+HeapDumpOnOutOfMemoryError 參數來讓虛擬機出現 OOM 的時候自動生成 dump 文件。 jmap 不僅能生成 dump 文件,還可以查詢 finalize 執行隊列、Java 堆和永久代的詳細信息,如當前使用率、當前使用的是哪種收集器等

命令格式
jmap [option] LVMID

option 參數

  • -dump : 生成堆轉儲快照
  • -finalizerinfo: 顯示在 F-Queue 隊列等待 Finalizer 線程執行 finalizer 方法的對象
  • -heap : 顯示 Java 堆詳細信息
  • -histo : 顯示堆中對象的統計信息
  • -permstat : to print permanent generation statistics
  • -F : 當 - dump 沒有響應時,強制生成 dump 快照

jhat#

jhat (JVM Heap Analysis Tool) 命令是與 jmap 搭配使用,用來分析 jmap 生成的 dump,jhat 內置了一個微型的 HTTP/HTML 伺服器,生成 dump 的分析結果後,可以在瀏覽器中查看。在此要注意,一般不會直接在伺服器上進行分析,因為 jhat 是一個耗時並且耗費硬件資源的過程,一般把伺服器生成的 dump 文件複製到本地或其他機器上進行分析

命令格式
jhat [dumpfile]
參數

  • -stack false|true 關閉對象分配調用堆棧跟蹤 (tracking object allocation call stack)。 如果分配位置信息在堆轉儲中不可用,則必須將此標誌設置為 false. 默認值為 true.>
  • -refs false|true 關閉對象引用跟蹤 (tracking of references to objects)。 默認值為 true. 默認情況下,返回的指針是指向其他特定對象的對象,如反向鏈接或輸入引用 (referrers or incoming references), 會統計 / 計算堆中的所有對象。>
  • -port port-number 設置 jhat HTTP server 的端口號。默認值 7000.>
  • -exclude exclude-file 指定對象查詢時需要排除的數據成員列表文件 (a file that lists data members that should be excluded from the reachable objects query)。 例如,如果文件列列出了 java.lang.String.value , 那麼當從某個特定對象 Object o 計算可達的對象列表時,引用路徑涉及 java.lang.String.value 的都會被排除。>
  • -baseline exclude-file 指定一個基準堆轉儲 (baseline heap dump)。 在兩個 heap dumps 中有相同 object ID 的對象會被標記為不是新的 (marked as not being new). 其他對象被標記為新的 (new). 在比較兩個不同的堆轉儲時很有用.>
  • -debug int 設置 debug 級別. 0 表示不輸出調試信息。 值越大則表示輸出更詳細的 debug 信息.>
  • -version 啟動後只顯示版本信息就退出 >
  • -J< flag > 因為 jhat 命令實際上會啟動一個 JVM 來執行,通過 -J 可以在啟動 JVM 時傳入一些啟動參數。例如,-J-Xmx512m 則指定運行 jhat 的 Java 虛擬機使用的最大堆內存為 512 MB. 如果需要使用多個 JVM 啟動參數,則傳入多個 -Jxxxxxx

jstack#

jstack 用於生成 java 虛擬機當前時刻的線程快照。線程快照是當前 java 虛擬機內每一條線程正在執行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現長時間停頓的原因,如線程間死鎖、死循環、請求外部資源導致的長時間等待等。

命令格式
jstack [option] LVMID

option 參數

  • -F : 當正常輸出請求不被響應時,強制輸出線程堆棧
  • -l : 除堆棧外,顯示關於鎖的附加信息
  • -m : 如果調用到本地方法的話,可以顯示 C/C++ 的堆棧

jinfo#

jinfo (JVM Configuration info) 這個命令作用是實時查看和調整虛擬機運行參數。 之前的 jps -v 口令只能查看到顯示指定的參數,如果想要查看未被顯示指定的參數的值就要使用 jinfo 口令

命令格式
jinfo [option] [args] LVMID

option 參數

  • -flag : 輸出指定 args 參數的值
  • -flags : 不需要 args 參數,輸出所有 JVM 參數的值
  • -sysprops : 輸出系統屬性,等同於 System.getProperties ()

JVM 調優配置參數#

堆配置#

  • -Xms: 設置堆的最小空間大小
  • -Xmx: 設置堆的最大空間大小
  • -XX:NewSize=n: 設置年輕代大小
  • -XX:NewRatio=n: 設置年輕代和年老代的比值。如:為 3 表示年輕代和年老代比值為 1:3,年輕代佔整個年輕代年老代和的 1/4
  • -XX:SurvivorRatio=n: 年輕代中 Eden 區與兩個 Survivor 區的比值。注意 Survivor 區有兩個。如 3 表示 Eden: 3 Survivor:2,一個 Survivor 區佔整個年輕代的 1/5
  • -XX:MaxPermSize=n: 設置持久代大小

收集器設置#

  • -XX:+UseSerialGC: 設置串行收集器
  • -XX:+UseParallelGC: 設置並行收集器
  • -XX:+UseParalledlOldGC: 設置並行年老代收集器
  • -XX:+UseConcMarkSweepGC: 設置並發收集器

並行收集器設置#

  • -XX:ParallelGCThreads=n: 設置並行收集器收集時使用的 CPU 數。並行收集線程數
  • -XX:MaxGCPauseMillis=n: 設置並行收集最大的暫停時間(如果到這個時間了,垃圾回收器依然沒有回收完,也會停止回收)
  • -XX:GCTimeRatio=n: 設置垃圾回收時間佔程序運行時間的百分比。公式為:1/(1+n)
  • -XX:+CMSIncrementalMode: 設置為增量模式。適用於單 CPU 情況
  • -XX:ParallelGCThreads=n: 設置並發收集器年輕代手機方式為並行收集時,使用的 CPU 數。並行收集線程數

垃圾回收統計信息配置#

  • -XX:+PrintGC
  • -XX:+PrintGCDetails
  • -XX:+PrintGCTimeStamps
  • -Xloggc:filename

JVM 調優案例#

參考鏈接:

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。