JVM チューニング方法

JDK はコマンド ツールを提供します

立つ

これは、仮想マシンのさまざまな実行ステータス情報を監視するためのコマンド ライン ツールです。クラスのロード、メモリ、ガベージ コレクション、JIT コンパイルなどの実行中のデータを、ローカルまたはリモートの仮想マシン プロセスで表示できます. GUI グラフィカル インターフェイスのないプレーン テキスト コンソール環境のみを提供するサーバーでは、.仮想 マシンのパフォーマンスの問題に最適なツール。

文法:

jstat -option pid

オプション パラメータは次のとおりです。
-class (クラス ローダー)
-compiler (JIT)
-gc (GC ヒープ ステータス)
-gccapacity (各地区のサイズ)
-gccause (最後の GC 統計と理由)
-gcnew (新しい地区統計)
- gcnewcapacity (新しい領域のサイズ)
-gcold (古い領域の統計)
-gcoldcapacity (古い領域のサイズ)
-gcpermcapacity (永続的な領域のサイズ)
-gcutil (GC 統計の要約)
-printcompilation (HotSpot コンパイルの統計)

GC ステータス コマンドを確認します。

jstat -gc pid 250 10

最後の 2 つのパラメーターは、250 ミリ秒ごとのクエリ、合計 10 個のクエリを表します。
戻り値の列の意味:
S0C : 最初のサバイバー領域 (From 領域) のサイズ
S1C : 2 番目のサバイバー領域 (To 領域) のサイズ
S0U : 1 番目のサバイバー領域の使用サイズ
S1U : 2 番目のサバイバー領域の使用サイズ
EC : サイズ(Eden) 領域の
EU : 使用されている (Eden) 領域のサイズ
OC : 旧世代のサイズ
OU : 旧世代のサイズ
MC : メソッド領域のサイズ
MU : 使用されているメソッド領域のサイズ
CCSC : 圧縮されたクラス空間のサイズ
CCSU : のサイズ圧縮クラス 使用容量
YGC : Young世代のガベージコレクション回数
YGCT : Young世代のガベージコレクション時間
FGC : Old世代のガベージコレクション回数
FGCT : Old世代のガベージコレクション時間
GCT : ガベージコレクションの合計時間

ジンフォ

仮想マシンのパラメーターを表示および変更します。
実稼働環境プログラムが次のように GC ログ コマンドを出力するかどうかを確認します。

 jinfo -flag PrintGC java进程Id

出力 -XX:-PrintGC はオフ、出力 -XX:+PrintGC はオンです。

GC ログ コマンドを動的に有効にします。

 jinfo -flag +PrintGC java进程Id

GC ログ コマンドを動的に閉じます。

 jinfo -flag -PrintGC java进程Id

jmap

ヒープ ダンプ スナップショット (一般にヒープダンプまたはダンプ ファイルと呼ばれる) を生成するために使用されます。jmap の役割は、ダンプ ファイルを取得することだけではなく、ファイナライズ実行キュー、Java ヒープ、および領域使用量、現在どのコレクターが使用されているかなどの永続世代の詳細を照会することもできます。jinfo コマンドと同様に、jmap には、ダンプ ファイルを生成するための -dump オプションと、各クラスのインスタンスおよび領域占有統計を表示するための -histo オプションを除いて、Windows プラットフォームで制限される多くの機能がすべてのオペレーティング システムで使用可能です。 、残りのオプションは Linux/Solaris でのみ使用できます。

ヒープ概要情報を出力します。

jmap –heap <pid>

戻り値の意味:
Heap Configuration: ##JVM パラメータ設定の結果である Heap 設定 [通常、Tomcat は JVM パラメータを設定します。これらを設定しています]
MinHeapFreeRatio = 40 ##最小ヒープ使用率
MaxHeapFreeRatio = 70 ##最大ヒープ使用率
MaxHeapSize = 2147483648 (2048.0MB) ## 最大ヒープ領域サイズ
NewSize = 268435456 (256.0MB) ## 新世代割り当てサイズ
MaxNewSize = 268435456 (256.0MB) ## 新世代最大割り当てサイズ
OldSize = 5439488 (5.1875MB) ## Old age size
NewRatio = 2 ##新世代の比率
SurvivorRatio = 8 ##生存者に対する新世代の比率
PermSize = 134217728 (128.0MB) ##Perm領域の永続世代サイズ
MaxPermSize = 134217728 (128.0MB) ##最大割り当て perm 領域は永続世代のサイズでもありますHeap Usage: ##ヒープ使用量 [実際のヒープ メモリ
の使用量]
1+2) スペース)
容量 = 241631232 (230.4375MB) ##Eden エリアの容量
used = 77776272 (74.17323303222656MB) ##使用サイズ
free = 163854960 (156.26426696777344MB) ##残り容量
32.188004570534986% used ##使用率
Eden Space: ##Eden 領域
容量 = 21 4827008 (204.875MB) ##エデン地区
使用容量= 74442288 (70.99369812011719MB) ##Eden エリア使用量
free = 140384720 (133.8813018798828MB) ##Eden エリア現在の残り容量
34.65220164496263% 使用 ##Eden エリア使用率
From Space: ##survior Zone 1
容量 = 268042 24 ( 25.5625MB) ## survior1 領域
の使用容量 = 3333984 (3.179534912109375MB) ##surviror1 領域の空き容量 = 23470240 (22.382965087890625MB) ##surviror1領域
の残りの容量 12.438278384
77995% 使用済み容量 = 26804224 (25.5625MB) # #survior2使用領域容量= 0 (0.0MB) ##survior2 使用領域



free = 26804224 (25.5625MB) ##survior2 領域残り容量
0.0% 使用 ##survior2 領域使用率
PS Old Generation: ##old 世代使用
容量 = 1879048192 (1792.0MB) ##old 世代
使用容量 = 30847928 (29.4188766479 4922MB ) ##旧世代の使用容量
フリー = 1848200264 (1762.5811233520508MB) ##旧世代の残容量
1.6416783843721663% 使用済み ##旧世代の使用率

各クラスのインスタンス数、メモリ使用量、およびクラスのフル ネーム情報を出力します。コマンドは次のとおりです。

jmap –histo <pid>
jmap –histo:live <pid>  #如果 live 子参数加上后,只统计活的对象数量.
jmap –histo pid | head -20  #只显示前20

ヒープ ダンプ ファイルの生成コマンド:

jmap -dump:live,format=b,file=heap.bin <pid>

ジャット

ダンプ ファイルのロード コマンド:

jhat dump 文件名

「サーバーの準備ができました。」というプロンプトが画面に表示された後、ユーザーはブラウザーに http://localhost:7000/ と入力して詳細にアクセスできます。jhat を使用して、サーバー上に分析用のヒープ ダンプ ファイルを生成します
ここに画像の説明を挿入
(一般的には推奨されません。結局のところ、サーバーのリソースを占有します。たとえば、ファイルが 1 G の場合、約 1 G のメモリ リソースを消費する必要があります)。
ダンプはメモリ スナップショットであり、ダンプ ファイルから表示できます。

jstack

一般的に言えば、jstack は主にデッドロックの有無をチェックするために使用されます。

JVM チューニング ソリューション

関連パラメータをオンにする

-XX:-HeapDumpOnOutOfMemoryError はデフォルトでは無効になっています.有効にすることをお勧めします.

-XX:HeapDumpPath=./java_pid.hprof は、ヒープ メモリ スナップショットのストレージ ファイル パスを設定するために使用され、デフォルトは Java プロセスの開始位置です。

アーサス

Arthas は Alibaba のオープン ソース Java 診断ツールで、開発者に愛されています。Arthas は JDK 6+ をサポートし、Linux/Mac/Windows をサポートし、コマンド ライン インタラクティブ モードを採用し、問題の特定と診断をさらに容易にする豊富なタブ自動補完機能を提供します。使用
には実戦経験が必要です。

ダッシュボード コマンド、パネル機能は次のとおりです。
ここに画像の説明を挿入
スレッド コマンド:
このコマンドは jstack に似ていますが、より強力で、主に現在の JVM のスレッド スタック情報を表示します。同時に、スレッド -b を組み合わせて使用​​して、デッドロックのトラブルシューティングを行うことができます。

パラメーターの説明:
-n は、最もビジーな上位 ​​n スレッドを指定し、スタックを出力します。
-b は、現在のスレッドをブロックしているスレッドを見つけます

jad コマンド:
指定されたロード済みクラスのソース コードを逆コンパイルし、クラスのフル パス名を指定して、クラスのソース コードを逆コンパイルし、本番環境での問題をトラブルシューティングします。

Trace コマンド:
trace コマンドを使用して、時間のかかる統計手法を追跡します。

コマンドの概要:
ここに画像の説明を挿入
ここに画像の説明を挿入

適切なガベージ コレクターを選択する

デフォルトのガベージ コレクタは STW 時間が長いため、高性能システムの場合は、CMS または G1 ガベージ コレクタを使用して STW 時間を短縮し、パフォーマンスを向上させることができます。

GC チューニング戦略

  • マイナー GC の頻度を減らす
    若い世代のスペースが小さいため、Eden 領域はすぐにいっぱいになり、頻繁なマイナー GC につながるため、若い世代のスペースを増やすことでマイナー GC の頻度を減らすことができます。1 つのマイナー GC 時間は、T1 (新しい世代のスキャン) と T2 (生き残ったオブジェクトのコピー) の 2 つの部分で構成されます。

JVM では、オブジェクトのコピーのコストはスキャンのコストよりもはるかに高くなります。ヒープ メモリ内に存続期間の長いオブジェクトが多数ある場合、若い世代の領域を増やすと、マイナー GC 時間が増加します。ヒープに短期間のオブジェクトが多数ある場合、新しい世代を拡張しても、単一のマイナー GC の時間は大幅に増加しません。したがって、1 回のマイナー GC の時間は、Eden 領域のサイズよりも、GC 後に生き残ったオブジェクトの数に大きく依存します。

  • Full GC の頻度を減らします。
    ヒープ メモリ スペースが不足していたり​​、古いオブジェクトが多すぎたりすると、Full GC がトリガーされます。頻繁に Full GC を実行すると、コンテキストの切り替えが発生し、システムのパフォーマンス オーバーヘッドが増加します。大きなオブジェクトの作成を減らし、ヒープ メモリ領域を増やすことで、フル GC の頻度を減らします。

メモリオーバーフローとメモリリークの違い

メモリ オーバーフロー: 単にメモリが不足しているため、通常はメモリ不足のエラーが報告されます。

メモリ リーク: メモリ内の不要なオブジェクトは gc でクリアできず、常にメモリ スペースを占有します。これはメモリ リークと呼ばれます。メモリ リークは、必ずしもメモリ オーバーフローにつながるわけではありませんが、リークが続くと、最終的にメモリ オーバーフローが発生します。

高 CPU の問題のトラブルシューティング

  1. top コマンドを使用して、CPU 使用率が高い Java プロセスの pid を調べます。
  2. top -p pid コマンドを使用して、ステップ 1 で見つかったプロセスを個別に表示します。
  3. 手順 2 の監視インターフェイスで H を入力して、現在のプロセスのすべてのスレッド情報を取得します。
    ここに画像の説明を挿入
  4. 特に高い CPU を消費するスレッド番号を見つけます
  5. jstack pid コマンドを実行して、現在のプロセスをダンプし、すべてのスレッド情報を出力します。
  6. 手順 4 で取得したスレッド番号を 16 進数に変換します。
  7. 手順 6 で取得したスレッド番号に基づいて、手順 5 のスレッド情報で対応するスレッド コンテンツを検索します。
  8. スレッド情報を解釈し、特定のコードの場所を見つけます。
    ここに画像の説明を挿入
    まとめ:
    CPU が 100% の場合、2 つの観点から始める必要があります. 1 つは、多くの無限ループを考えるなど、ビジネス スレッドが狂っている可能性があります。もう 1 つの可能性は、GC スレッドが狂ったようにリサイクルしていることです。これは、JVM の主流のガベージ コレクタもマルチスレッドであるため、簡単に CPU の 100% につながる可能性があるためです。

メモリ不足のトラブルシューティング

メモリ オーバーフローは通常、オブジェクトが多すぎることが原因で発生します。次のコマンドを使用して、どのオブジェクトが多すぎるかを問い合わせることができます。

jmap –histo pid | head -20

次に、該当するクラスが多い理由、再利用されない理由 (到達可能性分析など) を分析し、その理由をさらに分析します。

おすすめ

転載: blog.csdn.net/qq1309664161/article/details/128278386