JVMのトラブルシューティング手順

まず、使用JPSは、JavaアプリケーションのプロセスIDを取得します   

 

(Java仮想マシンプロセスステータスツール)       

 

    JPSの出力は、主ステータス情報を実行しているJVMを処理するために使用されます。構文は次のとおりです。

JPS [オプション] [ホストID]

    あなたはそれを現在のホストのホストIDまたはサーバーへのデフォルト値を指定しない場合。

    次のようにコマンドラインパラメータオプションは以下のとおりです。

-qクラス名、JAR名、着信mainメソッドのパラメータを出力しないでください

mainメソッドに渡された-m出力パラメータ

-l出力メインクラスまたはJARの完全修飾名

JVMに渡さ-v出力パラメータ

   次のような:

 

ルート@ Ubuntuの:/#JPS -m -l

2458 org.artifactory.standalone.main.Main /usr/local/artifactory-2.2.5/etc/jetty.xml

29920 com.sun.tools.hat.Main -port 9998 /tmp/dump.dat

3149 org.apache.catalina.startup.Bootstrap開始

30972 sun.tools.jps.Jps -m -l

8247 org.apache.catalina.startup.Bootstrap開始

25687 com.sun.tools.hat.Main -port 9999 dump.dat

21711 MRF-center.jar

第二に、プロセス番号を介してスレッド内の最もCPU集約型のプロセスを識別するために、

 

トップ-HPのPID(一般的に推奨)、メモリ消費量が21742を取得するために、スレッドのID番号を追跡することを選択し、スレッドIDを取得

各JavaスレッドはCPU時間を消費しているIMEの欄には、CPU時間は、スレッド21742の最長のスレッドIDです

 

printfの "%xとする\ n" 21742

    21742 16進数値54eeを取得し、次のように使用されます。 

使用のprintf「%X \ n」はスレッドIDは16進値に変換または手スレッドID値によって算出される16進数に変換されます。

 

第三に、使用jstackクエリメモリ消費量の値コードレベルがターゲット。

構文は次のとおりです。

jstackプロセスID |はgrep(変換後の16進スレッドID値)は、コードレベルに配置することができます。

ルート@ Ubuntuの:/#jstack 21711 | グレップの54ee

"PollIntervalRetrySchedulerThread" PRIO = 10 TID = 0x00007f950043e000 NID = 0x54eeはObject.waitにおける()[0x00007f94c6eda000]

    CPUの消費量)は、このクラスPollIntervalRetrySchedulerThreadはObject.wait(で見ることができます

 

Javaプロセスの情報を表示するために使用メインスレッドのスタックをjstack。構文は次のとおりです。 

jstack [オプション] PID

jstack [オプション]実行コア

jstack [オプション]、[サーバのid @]リモート・ホスト名またはIP-

    次のようにコマンドラインパラメータオプションは以下のとおりです。

 

-l長いリストは、デッドロックが発生した場合、追加のロック情報がjstack -l PIDロックの保有-m混合モードを観察するために使用することができるプリントアウトされます、だけでなく、出力Javaは情報をスタック++の情報は、C / Cで印刷されますスタックします(例えば、ネイティブメソッドのような)

    jstackは、それが使用JVMのパフォーマンスチューニングに非常に多くあるので、我々は、特定のコードをターゲットにすることができた情報によると、スタックをスレッドスタックを見つけることができます。コマンド使用のps、トップ、printf関数、jstack、グレップがある、のは、位置情報を最もCPU集中型Javaスレッドは、Javaプロセスのインスタンスを検索し、スタックしてみましょう。

四は、JSTAT(JVM統計監視ツール)FullGC状況を監視しシステムのFullGC周波数を取得します。

構文は次のとおりです。

 

JSTAT [generalOption | outputOptions VMID [間隔[秒| MS] [カウント]]]

    VMIDは、一般的にはLinuxの/ Unixシステム上のプロセスIDがあり、Java仮想マシンのIDです。間隔はサンプリング間隔です。カウントはサンプルの数です。GCの例は、以下の情報は、出力が、サンプリング時間間隔は250ミリ秒、サンプル数が4です。

 

ルート@ Ubuntuの:/#JSTAT 21711 250 4 -gc

S0C S1C S0U S1U EC EU OC OR PC PU YGC YGCT FGCのGCTFのGCT   

192.0 192.0 64.0 0.0 6144.0 1854.9 4111.6 32000.0 55296.0 25472.7 702 0.431 3 0.218 0.649

192.0 192.0 64.0 0.0 6144.0 1972.2 4111.6 32000.0 55296.0 25472.7 702 0.431 3 0.218 0.649

192.0 192.0 64.0 0.0 6144.0 1972.2 4111.6 32000.0 55296.0 25472.7 702 0.431 3 0.218 0.649

192.0 192.0 64.0 0.0 6144.0 2109.7 4111.6 32000.0 55296.0 25472.7 702 0.431 3 0.218 0.649

    上記の列の意味を理解するために、JVMのヒープメモリのレイアウトを見て:

 

 

    それは見ることができます。

 

古い世代の若い世代のヒープメモリは= + +永続的な世代

+ =エデン若い世代領域(およびまで)2つのサバイバーエリア

    今、各列の意味を説明します

 

S0C、S1C、S0U、S1U:サバイバー0/1面積容量(キャパシティ)と量(使用されます)

EC、EU:エデンの面積の大きさと量の

OC、OU:旧世代の容量と使用状況

PC、PU:容量と使用状況の恒久的な世代

YGC、YGT:若い世代のGCの数およびGC時間がかかります

FGC、FGCT:のフルフルGCとGCは数時間のかかります

GCT:GCの合計時間

 

 

五、 jmapは(メモリマップ)和jhat(Javaヒープ解析ツール)

    jmapのはjhat一般的な使用と組み合わせヒープメモリ使用量を表示するために使用されます。

    次のようにjmapの構文は次のとおりです。

jmapの[オプション] PID

jmapの[オプション]実行コア

jmapの[オプション]、[サーバのid @]リモート・ホスト名またはIP-

    あなたは、64ビットJVM上で実行している場合は、-J-D64オプションのコマンドパラメータを指定する必要があります。

jmapの-permstat PID

    クラスローダの印刷処理とクラスローダ永続オブジェクト情報の生成、出力:以下に示すように、オブジェクトが生きているかどうかをクラスローダ名、(信頼できない)、オブジェクトのアドレス、親クラスローダは、クラスのサイズおよび他の情報をロードされています:

   GCアルゴリズム、ヒープ構成パラメータ、及び各世代ヒープメモリ使用量の使用を含む、プロセスヒープメモリ使用量を表示するjmapの-heap PID使用。このような次の例のように:

ルート@ Ubuntuの:/#jmapの-heap 21711

ID 21711を処理するために取り付け、しばらくお待ちください...

デバッガが正常に取り付けられています。

サーバーのコンパイラが検出されました。

JVMのバージョンは20.10-B01であります

スレッドローカルオブジェクト割り当てを使用。

4スレッドと並列GC(S)

 

ヒープ構成:

MinHeapFreeRatio = 40   

MaxHeapFreeRatio = 70   

MaxHeapSize = 2067791872(1972.0メガバイト)

NewSizeパラメータ= 1310720(1.25メガバイト)

MaxNewSize = 17592186044415メガバイト

oldSize新しい= 5439488(5.1875メガバイト)

NewRatio = 2   

SurvivorRatio = 8   

PermSizeを= 21757952(20.75メガバイト)

MaxPermSizeを= 85983232(82.0メガバイト)

 

ヒープ使用量:

PS若い世代

エデンスペース:

   容量= 6422528(6.125メガバイト)

   使用= 5445552(5.1932830810546875メガバイト)

   無料= 976976(0.9317169189453125メガバイト)

   84.78829520089286%使用

宇宙から:

   容量= 131072(0.125メガバイト)

   使用= 98304(0.09375メガバイト)

   無料= 32768(0.03125メガバイト)

   75.0パーセント使用

空間に:

   容量= 131072(0.125メガバイト)

   使用= 0(0.0メガバイト)

   無料= 131072(0.125メガバイト)

   0.0%使用

PS旧世代

   容量= 35258368(33.625メガバイト)

   使用= 4119544(3.9287033081054688メガバイト)

   無料= 31138824(29.69629669189453メガバイト)

   11.683876009235595%使用

PSパーマ世代

   容量= 52428800(50.0メガバイト)

   使用= 26075168(24.867218017578125メガバイト)

   無料= 26353632(25.132781982421875メガバイト)

   49.73443603515625%使用

   ....

    使用jmapのを-histoの[:ライブ]のみ、オブジェクトを生きるライブ統計に置く場合は、ヒープ・メモリ内のビューオブジェクトのPID数は、ヒストグラムの大きさは、次のように:

 

ルート@ Ubuntuの:/#のjmapのを-histo:ライブ21711 | もっと

numが------------------------------------------- #bytesクラス名を#instances ---

   1:38445 5597736 <constMethodKlass>

   2:38445 5237288 <methodKlass>

   3:3500 3749504 <constantPoolKlass>

   4:60858 3242600 <symbolKlass>

   5:3500 2715264 <instanceKlassKlass>

   6:2796 2131424 <constantPoolCacheKlass>

   7:5543 1317400 [I

   8:13714 1010768 [C

   9:4752 1003344 [B

  10:1225 639656 <methodDataKlass>

  11:14194 454208 java.lang.Stringで

  12:3809の396136のjava.lang.Class

  13:4979 311952 [S

  14:5598 287064 [[I

  15:3028 266464 java.lang.reflect.Methodオブジェクト

  16:280 163520 <objArrayKlassKlass>

  17:4355 139360 java.util.HashMapを$エントリ

  18:1869 138568 [Ljava.util.HashMap $エントリ。

  2443 97720 java.util.LinkedHashMap $エントリ:19

  20:2072 82880 java.lang.ref.SoftReference

  21:1807 71528 [Ljava.lang.Object。

  22:2206 70592 java.lang.ref.WeakReference

  23:934 52304 Jawakutilklaidakedःashanap

  24:871 48776 java.beans.MethodDescriptor

  25:1442 46144 java.util.concurrent.ConcurrentHashMap $ HashEntry

  26 804 38 592 Jawakutilkःashanap

  27:948 37920 java.util.concurrent.ConcurrentHashMap $セグメント

  28:1621 35696 [Ljava.lang.Class。

  29:1313 34880 [Ljava.lang.String。

  1396 33504 java.util.LinkedList $エントリ:30

  31:462 33264をjava.lang.reflect.Field

  32:1024 32768するjava.util.Hashtable $エントリ

  33:948 31440 [Ljava.util.concurrent.ConcurrentHashMap $ HashEntry。

    クラス名のオブジェクト型、次のように:

 

Bバイト

Cのchar

ダブルD

Fフロート

私はint型

長いJ

Zブール

[アレイは、[I]は、[INTを例えば表すように

他のオブジェクトへ[L +クラス名

    ファイルへのプロセスのメモリ使用量のダンプをjmapの、その後の分析ビューjhat:非常に一般的な状況があるにもあります。次のようにdumpコマンド形式のjmapのは、次のとおりです。

 

jmapの-dump:フォーマット= B、ファイル= dumpFileName PID

上記のプロセスID 21711を実行するためにダンプします。

 

ルート@ Ubuntuの:/#jmapの-dump:フォーマット= B、ファイル=を/ tmp / dump.dat 21711     

/tmp/dump.datするヒープをダンプ...

ヒープダンプファイル作成

   ダンプファイルは、jhatと、ここでMAT、VisualVMのおよび他のツール、と見ることができます。

 

ルート@ Ubuntuの:/#jhat -port 9998 /tmp/dump.dat

/tmp/dump.datからの読み込み...

ダンプファイル作成火曜1月28日17時46分14秒CST 2014Snapshotは解決し、読んで...

132207のオブジェクトの解決...

参照を追いかけ、26個のドットを期待..........................

重複した参照を排除..........................

スナップショットは解決します。

ポート9998Server上のHTTPサーバの準備ができ始めました。

     ダンプファイルが大きすぎる場合、あなたは-J-Xmx512mを追加する必要があり、このパラメータは、9998 /tmp/dump.dat -port -J-Xmx512mをjhat最大ヒープメモリを指定することに注意してください。の9998ビュー:あなたは、ブラウザでホストアドレスを入力することができます

おすすめ

転載: www.cnblogs.com/name/p/11757141.html