本番環境では、Javaは、コマンドラインツールが付属しており、関連するダンプ解析ツールだけでなく、いくつかの小さなとすぐに、現在の動作ステータスを表示し、エラーメッセージを取得し、この時間に、視覚化ツールを新しいログをブレークポイントデバッグを渡すことはできません大いに問題の私達の調査の効率を高めることができるのヒント
運転パラメータ
あなたが手順を実行し理解を支援するために、次のリストのJavaプログラムに関する情報を表示するための一般的な、非常に効果的なコマンドとパラメータのいくつかは、実行されています。他の利用可能なパラメータが提供する多数の機能がありますが、自分自身を参照Oracleのマニュアルを
ビューのJVM引数
jps -l
スタートクラスのクラス名を表示し、同時に実行しているすべてのJavaプログラムを見る、PIDを取得
1 4706 org.apache.catalina.startup.Bootstrap 2 5023 sun.tools.jps.Jps
jinfo -flags PID
ビューの実行時JVMパラメータとプロセスパラメータ
1 ID 28987を処理するために取り付け、しばらくお待ちください... 2 デバッガが正常に取り付けられています。 3 サーバーコンパイラが検出されました。 4 JVMバージョン25.171-あるB11 5非デフォルト VMフラグ-XX:CICompilerCount = 3 -XX:InitialHeapSize = 132120576 -XX:MaxHeapSize = 2092957696 -XX:MaxNewSize = 697303040 -XX:MinHeapDeltaBytes = 524288 -XX:NewSizeパラメータ= 44040192 -XX:oldSize新しい= 88080384 -XX:+ UseCompressedClassPointers -XX:+ UseCompressedOops -XX:+ UseParallelGC 6コマンドライン:-Dspring.config.location = application.properties -Dspring.profiles.active =ステージング
java -XX:+PrintFlagsFinal -version
現在の仮想マシンのデフォルトのJVMパラメータを見ます
リアルタイムのステータスGCを見ます
jstat -gc PID 1000 10
毎秒GC情報、10回の合計を見ます
以上の出力パラメータを説明し、各フィールド参照https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html
1 S0C S1C S0U S1U EC社OC MU又はMC CCC CCSU YGC GCT YGCT FGC GCTF 2 512.0 512.0 15.3 0.0 4416.0 1055.2 7572.5 11372.0 14720.0 14322.5 1664.0 1522.8 40 0.137 8 0.039 0.176
プロンプト時に発生する可能性があるsun.jvm.hotspot.runtime.VMVersionMismatchException: Supported versions are 24.181-b01. Target VM is 25.171-b11
複数のバージョンがインストールされているため、問題の使用をwhich
、ls -l
現在のJavaプログラムのJavaバージョンを実行して、同じプロファイルに配置することができます
エラーの調査
メモリの問題
メモリリークがOOMを引き起こしますか?異常に高いメモリ使用量?これは、Javaが記録されているメモリに何が起こったかの私たちのためにダンプ・ファイルを提供し、本番環境はそれほど頻繁に問題です、私たちは貴重な情報を得ることから、いくつかのツールを使用する必要があります。
エクスポート・ダンプ・ファイル
- Javaプログラムの事前プラスこれらではパラメータダンプファイルを印刷
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./
- 使用してプログラムを実行するためjmapのを:
jmap -dump:format=b,file=heap.hprof PID
ダンプファイルの解析
ダンプファイルが大きすぎない場合には、それがために広めることができhttp://heaphero.io/index.jsp分析すること
ファイルが大きく、あなたはより体系的な分析を実行したい、推奨MATのいくつかの一般的なビューがあり、分析
- [リーク容疑者は、どこに問題が嘘を把握することができますホーム]
- クリックし、[すべてのオブジェクトの数だけ存在するオブジェクトの任意のセットからヒストグラムを作成します]
- オブジェクトを右クリックし、[ルーツをGCに最短経路をマージ] - > [すべてのファントム/弱い/ソフト等の参照を除外する]どのGCのROOT多数の文献にオブジェクトを照会することができます
スレッドの問題
撤退しないように長い時間のためのタスク?CPUの負荷が高すぎますか?何も記憶に関係しないようにするので、ログは、エラーメッセージを参照してください、しかしたり、ファイルや分析をダンプすることはできませんので、おそらく無限ループやデッドロックの、いくつかのスレッドをリードするには、中断することなく実行されているが、エラーは最も厄介ではありません。今回は、私たちを助けるために、スレッド分析ツールを使用する必要があります。
エクスポートjstackファイル
使用しjstack PID > 文件
、それは追加してください失敗した場合-F
、それが失敗した場合、パラメータをJavaプログラムが実行jstackを起動する使用するユーザーを使用して、以下の出力フォーマットjstackの一部であり、
1 线程名PID的16进制 2 "HTTP-NIO-8080-アクセプタ0" #17デーモンPRIO = 5 os_prio = 0 TID = 0x00007fac2c4bd000 NID = 0x29f4ランナブル[0x00007fac192f6000 ] 3 java.lang.Thread.State:RUNNABLE( Tomcatの的工作线程正在运行、有NEW / RUNNABLE / BLOCKED / WAITING / TIMED_WATING / 状态TERMINATED) 4 sun.nio.ch.ServerSocketChannelImpl.accept0(ネイティブメソッド)で 5 sun.nio.ch.ServerSocketChannelImpl.acceptで(ServerSocketChannelImpl。ジャワ:422 ) 6 sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250で) 7 -ロック<0x00000000faf845a8> (java.lang.Object上位) 8 org.apache.tomcat.util.net.NioEndpoint $ Acceptor.run(NioEndpoint.java:682で) 9 java.lang.Thread.runで(Thread.java:748)
出力jstackは、スレッドが、この時間に実行されている可能性があり、我々はスレッドを作成している私たち自身を実行しているかを確認することができ、すべてのスレッドおよびそれらの状態を見ることができますスレッド名、これは特に重要新しいスレッドを作成するときに意味のあるスレッド名を指定することをお勧めします。もちろん、PIDに目を通すにも大変便利です。
トラブルシューティングの手順
top
高負荷に表示するJavaプログラムtop -p PID -H
プロセスを実行中のすべてのプロセスのステータスを表示- 高負荷下で記録スレッドIDは、
printf "&x" PID
16進数に変換しました jstack PID > 文件
- jstackとHEXファイルの後にスタックを実行しているスレッドIDのクエリスレッドに変換
- 経営判断のコードと組み合わせてどのようなタスクの実装で学んだスレッド・スタック、そこから