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 : ロードされたクラスの数
  • Bytes : クラスのバイトサイズ
  • Unloaded : アンロードされたクラスの数
  • Bytes : アンロードされたクラスのバイトサイズ
  • 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 : 圧縮クラススペースが占有する最小スペース
  • CCSMX : 圧縮クラススペースが占有する最大スペース
  • CCSC : 圧縮クラススペースの容量
-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 と同様)、最近の 2 回のガベージコレクションイベントの原因を追加

$ 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) コマンドはヒープダンプファイルを生成するために使用されます。このコマンドを使用しない場合、-XX:+HeapDumpOnOutOfMemoryError パラメータを使用して、仮想マシンが OOM になると自動的にダンプファイルを生成することもできます。jmap はダンプファイルを生成するだけでなく、finalize 実行キュー、Java ヒープ、永続世代の詳細情報(現在の使用率、現在使用している収集器など)を照会することもできます。

コマンド形式
jmap [option] LVMID

option パラメータ

  • -dump : ヒープダンプスナップショットを生成
  • -finalizerinfo: F-Queue キューで Finalizer スレッドによる finalizer メソッドの実行を待っているオブジェクトを表示
  • -heap : Java ヒープの詳細情報を表示
  • -histo : ヒープ内のオブジェクトの統計情報を表示
  • -permstat : 永続世代の統計を表示
  • -F : -dump が応答しない場合、強制的にダンプスナップショットを生成

jhat#

jhat (JVM Heap Analysis Tool) コマンドは jmap と組み合わせて使用され、jmap が生成したダンプを分析するために使用されます。jhat は内蔵のミニ HTTP/HTML サーバーを持ち、ダンプの分析結果を生成した後、ブラウザで表示できます。ここで注意が必要なのは、一般的にサーバー上で直接分析を行うことはなく、jhat は時間がかかり、ハードウェアリソースを消費するプロセスであるため、サーバーで生成されたダンプファイルをローカルまたは他のマシンにコピーして分析することが一般的です。

コマンド形式
jhat [dumpfile]
パラメータ

  • -stack false|true オブジェクト割り当て呼び出しスタックトレースをオフにします。割り当て位置情報がヒープダンプに利用できない場合、このフラグを false に設定する必要があります。デフォルト値は true です。
  • -refs false|true オブジェクト参照トラッキングをオフにします。デフォルト値は true です。デフォルトでは、返されるポインタは他の特定のオブジェクトを指し、逆リンクや入力参照など、ヒープ内のすべてのオブジェクトを統計 / 計算します。
  • -port port-number jhat HTTP サーバーのポート番号を設定します。デフォルト値は 7000 です。
  • -exclude exclude-file オブジェクトクエリ時に除外する必要があるデータメンバーリストファイルを指定します。例えば、ファイルが java.lang.String.value をリストしている場合、特定のオブジェクト Object o から到達可能なオブジェクトリストを計算する際に、java.lang.String.value に関与する参照パスはすべて除外されます。
  • -baseline exclude-file 基準ヒープダンプを指定します。2 つのヒープダンプで同じオブジェクト ID を持つオブジェクトは新しいものではないとマークされます。他のオブジェクトは新しいとマークされます。2 つの異なるヒープダンプを比較する際に便利です。
  • -debug int デバッグレベルを設定します。0 はデバッグ情報を出力しないことを意味します。値が大きいほど、より詳細なデバッグ情報が出力されます。
  • -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 区と 2 つの Survivor 区の比率。注意:Survivor 区は 2 つあります。例えば 3 の場合、Eden:3 Survivor:2 であり、1 つの 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 調整事例#

参考リンク:

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。