個人ブログのナビゲーションページ(クリック、右側にリンク個人のブログを開くために):ダニエルは、テクノロジ・スタックにあなたを取ります
JVMガベージコレクションの知識によって前、私たちは、JVMのメモリ割り当てとガベージコレクションがどのように対処するであることを理解します。理論は理論的な指導、時間の位置、知識と経験が重要な基礎であると、データは私たちのための基礎を提供することができ、練習をガイドするためのツールです。
私たちのほとんどは、次のような問題を経験する一般的なオンライン問題で:
- メモリリーク
- プロセスCPU急増
- スレッドのデッドロック
- 反応が遅い...など他の問題について。
あなたは上記の問題が発生した場合は、そこにローカルビューをサポートするためのオンラインツールの様々なことができますが、ラインアップするために、地元のデバッグツールをサポートするためにそんなにない、どのように我々は問題を特定するための監視ツールをベースとしますか?
我々は通常の場所収集されたデータに基づいて、データ収集は、次のようなツールは、監視プロセスと不可分である:実行中のログ、例外スタック、GCログ、スレッドのスナップショット、ヒープのスナップショットを。多くの場合、適切な分析を使用して監視ツールは、問題を解決するために速度を位置付け、当社のデータ分析を高速化することができます。以下は、私たちは詳細を説明します。
A、JVMの共通監視ツール&説明書
1、JPS:JVMプロセスステータスツール
jps [options] [hostid]
あなたは、現在のホストのホストIDまたはサーバにデフォルト値を指定しなかった場合。
次のようにコマンドラインパラメータオプションは次のとおりです。
-q 不输出类名、Jar名和传入main方法的参数
- l 输出main类或Jar的全限名
-m 输出传入main方法的参数
- v 输出传入JVM的参数
例えば:
2、JSTAT:ツールを監視JVM統計
JSTATは知識ラインツールのさまざまな仮想マシンのステータス情報を実行するコマンドです。それは、オンラインポジショニングJVMのパフォーマンスのために最適なツールで、クラスのロード、メモリ、ガベージコレクション、JITコンパイラおよびその他の動作データの過程で、ローカルまたはリモートの仮想マシンを表示することができます。
フォーマット:
jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]
generalOption - 单个的常用的命令行选项,如-help, -options, 或 -version。
outputOptions -一个或多个输出选项,由单个的statOption选项组成,可以和-t, -h, and -J等选项配合使用。
パラメータのオプション:
オプション |
表示 |
例 |
クラスローディング条件を見る統計 |
JSTAT級PID:ロードされたクラスの数、および占有スペースに情報を表示します。 |
|
コンパイルケースホットスポットにリアルタイムコンパイラで見る統計 |
JSTAT -compiler PID:VMは、コンパイルの数などのリアルタイム情報を表示します。 |
|
統計の表示JVMガベージコレクションの状況ヒープ |
JSTAT -gc PID:GC情報は、GCの数、および時刻を表示するために表示することができます。最後の5、それぞれ、若いGC、若いGC時間数、フルGC、フルGC時間、GCの合計時間数。 |
|
ビューのストレージ容量は、新世代、旧世代と恒久的な世代です |
JSTAT -gccapacity:3世代(若い、古い、パーマ)は、オブジェクトのサイズによって占有VMのメモリを使用して、表示され、 |
|
ガベージコレクションが発生した場合、ビューの統計情報は、ガベージコレクション(このオプションとなど-gcutil)、それは最後の時間とガベージコレクションが現在行われている理由が表示されます。 |
JSTAT -gccause:GCショーの理由 |
|
新世代のガベージコレクションの状況を見ます |
JSTAT -gcnew PID:情報新しいオブジェクト |
|
ストレージ容量の新世代のためのビューケース |
JSTAT -gcnewcapacity PID:新しいオブジェクトの情報とフットプリント |
|
GCの旧世代と永久世代の発生のためのケースを見ます |
JSTAT -gcold PID:情報古いオブジェクト |
|
容量を表示するための古い世代 |
JSTAT -gcoldcapacity PID:情報と古いオブジェクトのその足跡 |
|
永久的な発電容量を表示するための |
JSTAT -gcpermcapacity PID:情報とその足跡パーマオブジェクト |
|
状況は旧世代とガベージコレクションの所有者に代わって、新しい世代を見ます |
JSTAT -util PID:統計情報統計GC |
|
統計的手法のHotSpotのコンパイル |
JSTAT -printcompilation PID:現在の情報のVMの実行 |
例えば:
ビューGCの実装:JSTAT-gcutil 27777
3、Jinfoの:Javaの構成情報
フォーマット:
jinfo[option] pid
たとえば、次のようにJVMが実行され、現在のプロセスの一部を開始取得。
4、jmapは:Javaのメモリマッピングツール
ヒープダンプ・スナップショットの生産のためjmapの順。(:、それらのオブジェクトを生成し、その数など)は、Java(PIDを使用して)プロセス、メモリ内のすべての「オブジェクト」をプリントアウト。
フォーマット:
jmap [ option ] pid
jmap [ option ] executable core
jmap [ option ] [server-id@]remote-hostname-or-IP
パラメータのオプション:
-dump:[live,]format=b,file=<filename> 使用hprof二进制形式,输出jvm的heap内容到文件=. live子选项是可选的,假如指定live选项,那么只输出活的对象到文件.
-finalizerinfo 打印正等候回收的对象的信息.
-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况.
-histo[:live] 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量.
-permstat 打印classload和jvm heap长久层的信息. 包含每个classloader的名字,活泼性,地址,父classloader和加载的class数量. 另外,内部String的数量和占用内存数也会打印出来.
-F 强迫.在pid没有相应的时候使用-dump或者-histo参数. 在这个模式下,live子参数无效.
-h | -help 打印辅助信息
-J 传递参数给jmap启动的jvm.
例えば:
使用jmapの-heap PID GCアルゴリズムを使用する、ヒープ設定パラメータ、及び各世代ヒープメモリ使用を含むプロセスヒープメモリの使用状況を表示します。
使用jmapの-histo [:ライブ] PIDヒープメモリ内のオブジェクトの数、ヒストグラムのサイズを確認します。
5、jhat:JVMのヒープスナップショット解析ツール
高速なストレージを使用するとjhatコマンドJAMPは、ヒープのスナップショット・マップ・生産を分析するために使用しました。jhatはミニチュアHTTP / HTML形式のサーバを構築し、ブラウザで表示を見つけることができます。しかし、提案された試しがdumptファイル以来、本番環境の下から引き出すことができ、その後、地元の可視化ツールで分析し、行うために、両方のは、サーバ上のライン圧力を減らすために、(のようなMAT / jprofile / VisualVMは)、などが十分詳細にそこに分析することができます。
6、jstack:Javaスタックトレースツール
jstackスレッドは、現在の時刻のJava仮想マシンのスナップショットを生成するために使用されます。スナップショットは、各実行スレッド・スタック・コレクション、スレッドのスナップショットを生成する主な目的は、スレッドは、スレッド間のデッドロック、無限ループとして長い休止を表示配置することである、現在のスレッドのJava仮想マシン内のメソッドである、長いによって引き起こされる外部リソースを要求し上のように待機する時間。
フォーマット:
jstack [ option ] pid
jstack [ option ] executable core
jstack [ option ] [server-id@]remote-hostname-or-IP
パラメータ:
-F当’jstack [-l] pid’没有相应的时候强制打印栈信息
-l长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.
-m打印java和native c/c++框架的所有栈信息.
-h | -help打印帮助信息
pid 需要被打印配置信息的java进程id,可以用jps查询.
ほとんどのCPUを消費以降の例が使用されますを検索します。
第二に、可視化ツール
JConsoleのとVisualVMのに加えて、監視するためのJVM共通の視覚化ツールが提供自体をjdk、ならびにサードパーティjprofilter、perfino、Yourkit、Perf4j、JProbeに、MATなど。これらのツールは非常に私たちのポジショニングと最適化JVMの道を豊かにしています。
これらのツールを使用して、あまり紹介しないであろう、ここで提供される多くのオンラインチュートリアルがあります。VisualVMのために、比較がJVMに加えてより低い、または独自の開発チームををjdk侵襲することが推奨され、私は将来はより多くの機能が豊かで完璧になると考えています。最も完全な、最新のIDEがオンライン一緒に使用することができる前に、デバッグとパフォーマンスチューニングのためのプラグインをサポートする機能性と可視化を提供し、サードパーティ製の監視ツールのjprofilter。
ダンプ・ヒープライン情報に加えて、ラインは、分析のための可視化ツールになるように、より詳細な分析を引っ張るようにしてください。いくつかの緊急の問題については、オンライン監視する必要がある場合は、リモート機能はtool.jarに使用MAT機能を必要とVisualVMのに使用することができます。
第三に、アプリケーション
1、CPU舞い上がります
時には、いくつかの点では、アプリケーションは、オンラインCPUの突然の急増があるだろういくつかの点で問題がある可能性があります。これは、我々はいくつかの命令、迅速な調査と対応するコードを理解する必要があります。
最もCPU集約型のプロセスを見つけ1.
命令:
top
最も多くのCPUスレッドを消費し、このプロセスを探します。2.
命令:
top -Hp pid
3.変換六角
printf “%x\n” 15332 // 转换16进制(转换后为0x3be4)
4.フィルター指定されたスレッド、印刷スタック情報
命令
jstack pid |grep 'threadPid' -C5 --color
jstack 13525 |grep '0x3be4' -C5 --color // 打印进程堆栈 并通过线程id,过滤得到线程堆栈信息。
レポートプログラムは、過度のCPU占有率を見ることができる(実施例を超えていない高いCPU自体の費用がかかり、単なる例示です)
2、スレッドのデッドロック
時には展開シナリオスレッドのデッドロックの問題が、一般的ではないがあるでしょう。この時、私たちは何jstackの下で見るために使用されます。例えば、我々は今待っている中でいくつかの操作で、その結果、プログラムのスレッドデッドロックを持っています。
JavaのプロセスIDを探す1
命令:
top 或者 jps
javaプロセススレッドのスナップショット情報を確認してください2。
命令:
jstack -l pid
あなたは、デッドロックが発生したスレッドがあり、出力から見ると、コードの行が表示されることを指摘することができます。あなたは、迅速に問題のトラブルシューティングを行うことができるように。
3、OOMのメモリリーク
Javaヒープの例外でOOMは、共通のメモリオーバーフロー例外の実用化されています。一般的に、我々は、メモリの問題内のオブジェクトかどうかを確認するために、(たとえば、MATなど)のメモリマッピング分析ツールのダンプヒープダンプのスナップショットの分析の最初に出ています。
OOMの出現のためのコースは多くの理由ではなく、アプリケーション・ヒープ・リソース不足の状況であります。解放されていない、あまりにも多くのリソースを適用することも可能である、または頻繁に頻繁なアプリケーションは、システムリソースが枯渇しています。3例のために私は1回の調査を必要とします。
OOM 3例:
リソース(メモリ)の1.アプリケーションが小さすぎて、十分でありません。
2.何のリリースはありませんが、あまりにも多くのリソースのために適用します。
3.あまりにも多くのリソース、リソースの枯渇を適用します。たとえば、次のようにあまりにも多くのスレッド、スレッドあまりにも多くのメモリのように。
1.トラブルシューティングアプリケーションのアプリケーション・リソースの問題。
指令:jmap -heap 11869
新世代、旧世代ヒープメモリ使用量の大きさの分布を見ると、分布自体が小さすぎるかどうかを確認します。
以上の検討から、アプリケーション・プログラム・メモリに問題が見つかりませんでした。
2.調査GC
FGCは特に場合、各世代のメモリです。
指令:jstat -gcutil 11938 1000 每秒输出一次gc的分代内存分配情况,以及gc时间
最も高価なメモリオブジェクトを探す3。
指令: jmap -histo:live 11869 | more
出力情報は、正常範囲内でのみ161キロバイトの最大メモリ・オブジェクトを、前記しました。目的は、100Mbのより多くのように広い空間であれば、分析が解放していない理由に焦点を当てるべきです。
その、コマンドに注意してください。
jmap -histo:live 11869 | more
执行之后,会造成jvm强制执行一次fgc,在线上不推荐使用,可以采取dump内存快照,线下采用可视化工具进行分析,更加详尽。
jmap -dump:format=b,file=/tmp/dump.dat 11869
或者采用线上运维工具,自动化处理,方便快速定位,遗失出错时间。
資源が枯渇しているかどうかを確認します。4.
- pstreeは、プロセスのスレッドの数を参照してください
- netstatコマンドは、ネットワーク接続の数を表示します
または使用します:
- LL / procの/ $ {PID} / FD |トイレ-l開いているハンドルの数//
- LL / procの/ $ {PID} /タスク|トイレ-l(同じ効果pstreeコマンドの-p |トイレ-l)オープンスレッドの数//
これらは、一般的なコマンドのJVMアプリケーションの一部です。
ツールの適用は、マスターキー、治療法、問題解決、多くの場合、より良い問題を特定するためにさまざまなツールを組み合わせる必要ではないに関係なく、分析ツールの、最も重要なことは、各ツールの利点をよく知っていますそして、弱み。使用して、お互いから学ぶように。
付属のJava / C / C ++ /機械学習/アルゴリズムとデータ構造/フロントエンド/アンドロイド/パイソン/プログラマ読み/シングル書籍図書Daquanは:
(乾燥した個人ブログでそこ開くには、右クリックしてください):技術的なドライ開花を
===== >> ①[Javaのダニエルは、高度なへの道であなたを取る] << ====
===== >> ②[+ ACMアルゴリズムデータ構造ダニエルは、高度なへの道であなたを取る] << ===
===== >> ③[データベースダニエルは高度への道であなたを取る] << == ===
===== >> ④[ダニエルWebフロントエンドの高度への道であなたを取るために] << ====
===== >> ⑤[機械学習のPythonとダニエルあなたにエントリを取ります高度なロード] << ====
===== >> ⑥[建築家ダニエルは高度への道であなたを取る] << =====
===== >> ⑦[C ++ダニエルは、道路上をお連れに進ん] << ====
===== >> ⑧[ダニエルは高度への道であなたを取るのiOS] << ====
=====> > ⑨[ウェブセキュリティダニエルは、高度なへの道であなたを取る] ===== <<
===== >> ⑩[Linuxオペレーティングシステムを、ダニエルは高度への道であなたを取る] = << ====何の未収果物はありません、あなたの若い友人は、友人がテクニックを学びたい願って、道路の方法ですべての障害を克服することは、技術に結びつける本を理解して、コードをノック、原理を理解し、実践を行くことになります決定しましたそれはあなたの将来、あなたの夢を生活、あなたの仕事をもたらすでしょう。