JVM に固執する | Arthas を使用して JVM メモリをチェックするのは素晴らしいことです。

JVM に固執する | Arthas を使用して JVM メモリをチェックするのは素晴らしいことです。

[[402910]]

この記事はWeChatの公開アカウント「Mu Xiaonong」から転載したもので、著者はMu Xiaonongです。この記事を転載する場合は、穆小農の公式アカウントまでご連絡ください。

Arthasとは

システムで JVM やメモリ オーバーフローなどの問題が発生した場合、プログラムを効果的に監視してトラブルシューティングするにはどうすればよいでしょうか? JDK に付属する jconsole や jvisualvm など、よく使用されるツールがいくつか見つかりました。最もよく使用されるツールである jprofiler もありますが、これは有料であり、非常に裕福な企業を除いて、使用する人はほとんどいません。もう一人は今日の主人公、アルサスです。なぜ今日これに焦点を当てるのでしょうか?

公式ウェブサイトアドレス: http://arthas.gitee.io/

GitHub アドレス: https://github.com/alibaba/arthas/

Arthas は Alibaba のオープンソース Java 診断ツールです。コマンドライン対話モードを使用し、豊富な機能を提供します。これは、使いやすく強力な JVM トラブルシューティング用の無料プラグインです。このツールについて知った後、非常に使いやすく、包括的な機能をサポートしていることがわかりました。それで、Arthas は私たちに何ができるのでしょうか?

1. スレッド、CPU、メモリなどの情報を含むパフォーマンス ダッシュボードを提供し、定期的に更新します。

2. さまざまな条件に基づいてスレッドのスナップショットを表示します。 CPU使用率が最も高いn個のスレッドを見つける

3. gc アルゴリズム、jdk バージョン、ClassPath など、jvm のさまざまな情報を出力します。

4. 問題が発生してオンラインでデバッグできない場合は、ホットデプロイメントとログを直接置き換えることができます。

5. クラスの静的プロパティを表示し、OGNL構文を使用していくつかのステートメントを実行することもできます。

6. ロードされたクラスの詳細情報、クラスがどのjarパッケージからロードされたか、クラスメソッドの情報を表示します。

7. クラスのバイトコードを指定されたディレクトリにダンプする

8. 指定されたクラスを直接逆コンパイルする

9. アプリケーションのホットスポットを素早く見つけ、フレームグラフを生成する

10. JVMのリアルタイム実行状況を監視できます

これまで、このような問題が発生した場合の解決策は、ほとんどの場合、コードを修正してオンラインに戻すことでした。しかし、大企業ではオンラインでの手続きは非常に面倒です。ログを 1 行追加するためだけにバージョンを再リリースする必要がある場合、それは間違いなく非常に面倒になります。しかし、Alibaba のオープンソース Arthas には、より洗練されたオンライン デバッグ方法があります。

Arthas は JDK6 をサポートしており、Linux/Mac/Windows で実行できます。自動タブ補完機能を備えているため、問題の特定や診断が容易になります。

ダウンロードアドレス: https://arthas.gitee.io/download.html zipパッケージをダウンロードできます。 arthas-packaging-3.5.0-bin.zipをダウンロードするか、コマンドでダウンロードします

https://alibaba.github.io/arthas/arthas-boot.jar を取得します。

ユーザーマニュアル

1. クイックスタート

ダウンロードしたら、java -jar arthas-boot.jarコマンドで直接起動できますが、その前に検出コードを使用してArthasにハングアップする必要があります。

  1. java.math.BigDecimal をインポートします。
  2. java.util.ArrayList をインポートします。
  3. java.util.Dateをインポートします
  4. java.util.List をインポートします。
  5. java.util.concurrent.ScheduledThreadPoolExecutor をインポートします。
  6. java.util.concurrent.ThreadPoolExecutor をインポートします。
  7. java.util.concurrent.TimeUnitをインポートします。
  8.  
  9. パブリッククラス FullGCTest {
  10.  
  11.  
  12. //銀行カードクラスをシミュレートする
  13. プライベート静的クラスCardInfo {
  14. //小規模農家の銀行カード情報記録
  15. BigDecimal価格 = 新しいBigDecimal(10000000.0);
  16. 文字列= "Small Farmer" ;
  17. 年齢= 18;
  18. 日付birthdate = new Date ();
  19.  
  20. パブリックvoid m() {}
  21. }
  22.  
  23. //スレッドプール時間指定スレッドプール
  24. //50、拒否戦略を設定する
  25. プライベート静的ScheduledThreadPoolExecutorエグゼキュータ = 新しいScheduledThreadPoolExecutor(50,
  26. 新しい ThreadPoolExecutor.DiscardOldestPolicy());
  27.  
  28. 公共 静的void main(String[] args)は例外をスローします{
  29. 実行者.setMaximumPoolSize(50);
  30.  
  31. のために(;;){
  32. モデルフィット();
  33. スレッド.sleep(100);
  34. }
  35. }
  36.  
  37. /**
  38. * 銀行カードのリスク評価を実施する
  39. */
  40. プライベート静的void modelFit(){
  41. リスト<CardInfo> taskList = getAllCardInfo();
  42. //すべての情報を取り出す
  43. タスクリスト.forEach(情報 -> {
  44. // 何かをする
  45. executor.scheduleWithFixedDelay(() -> {
  46. //Mメソッドを呼び出す
  47. 情報.m();
  48.  
  49. }, 2, 3, TimeUnit.SECONDS);
  50. });
  51. }
  52.  
  53. プライベート静的リスト<CardInfo> getAllCardInfo(){
  54. リスト<CardInfo> taskList = 新しいArrayList<>();
  55. // 毎回 100 枚のカードを照会する
  56. ( int i = 0; i < 100; i++)の場合{
  57. カード情報ci = 新しいカード情報();
  58. タスクリストを追加します(ci) ;
  59. }
  60.  
  61. タスクリストを返します
  62. }
  63. }

これは前回の記事で説明したケースです。興味があれば、ぜひ学んでみてください。

まず、javac コマンドを使用して Java ファイル javac FullGCTest.java をコンパイルし、リスク監視用の GC ログを印刷する必要があります。

  1. java -Xms200M -Xmx200M -XX:+PrintGC FullGCテスト

Arthasの起動コマンド: java -jar arthas-boot.jar、取得

先ほど開始した FullGCTest アプリケーションが表示されます。数字1を入力してEnterを押します。このようにして、Arthas をプログラムに追加します。次に、対応するコマンド操作を実行するだけです。

コマンドの詳細ドキュメント: https://arthas.aliyun.com/doc/commands.html

2. 機能一覧

注文詳細な説明
仮想マシン現在の JVM 情報を表示する
現在のJVMのスレッドスタック情報を表示します
時計メソッド実行データ観測
ダッシュボード現在のシステムのリアルタイムデータパネル
トレースメソッドの内部呼び出しパスと、メソッドパス上の各ノードで消費された時間を出力します。
スタック現在のメソッドの呼び出しパスを出力する
tt メソッド実行データの時空間トンネルは、指定されたメソッドの各呼び出しの入力と戻り情報を記録し、異なる時間にこれらの呼び出しを観察することができます。
vmoption オプション JVMによってロードされたクラス情報を表示および更新する
scで JVMによってロードされたクラス情報を表示する
小さいロードされたクラスのメソッド情報を表示する
ジャド指定されたロードされたクラスのソースコードを逆コンパイルする
クラスローダークラスローダーの継承ツリー、URL、クラスロード情報を表示します。
ヒープダンプ jmapコマンドのヒープダンプ機能に似ている

仮想マシン

オペレーティング システム: システム関連パラメータ

スレッド関連:

  • COUNT: JVM内で現在アクティブなスレッドの数
  • DAEMON-COUNT: JVMの現在アクティブなデーモンスレッドの数
  • PEAK-COUNT: JVM が起動されてから現在までに実行されたスレッドの最大数
  • STARTED-COUNT: JVM の起動以降に開始されたスレッドの合計数
  • DEADLOCK-COUNT: JVM内で現在デッドロックしているスレッドの数

FILE-DESCRIPTOR (ファイル記述子関連):

  • MAX-FILE-DESCRIPTOR-COUNT: JVMプロセスが開くことができるファイル記述子の最大数
  • OPEN-FILE-DESCRIPTOR-COUNT: JVMによって現在開かれているファイル記述子の数

スレッドコマンド

パラメータの説明:

注文詳細な説明
id スレッドID
[名詞:] 最も忙しいN個のスレッドを指定して、そのスタックを印刷する
[b] 現在どのスレッドが他のスレッドをブロックしているか調べる
[私] CPU 使用率統計のサンプリング間隔をミリ秒単位で指定します。デフォルト値は200です
[ - 全て] 一致するスレッドをすべて表示

現在最もビジーなN個のスレッドを出力し、スタックを出力する

  1. スレッド-n 3

スレッド すべてのスレッドを表示

スレッド17: 指定されたスレッドの実行スタックを表示します

スレッド -i: サンプリング時間間隔を指定する

thread -i 1000 : 最後の 1000 ミリ秒のスレッド CPU 時間をカウントします。 thread -n 3 -i 1000 : 1000ms 以内に最もビジーな 3 つのスレッド スタックを一覧表示します。

ダッシュボードコマンド

プログラムを実行すると、qps、rt、エラー数、スレッド プール情報など、現在のプログラムのリアルタイム情報が表示されます。

データの説明:

  • ID: JavaレベルのスレッドID
  • NAME: スレッド名
  • GROUP: スレッドグループ名
  • 優先度: スレッドの優先度。1~10の数字で、数字が大きいほど優先度が高くなります。
  • STATE: スレッドの状態 CPU%: スレッドの CPU 使用率。たとえば、サンプリング間隔が1000msで、スレッドの増分CPU時間が100msの場合、CPU使用率 = 100/1000 = 10%となります。
  • DELTA_TIME: 最後のサンプリング後のスレッドの増分CPU時間。データ形式は秒です。
  • TIME: 実行中のスレッドの合計CPU時間。データ形式は分:秒です。
  • ?NTERRUPTED: スレッドの現在の割り込みビットの状態
  • DAEMON: デーモンスレッドですか?

パラメータの説明:

パラメータ名詳細な説明
id リアルタイムデータを更新する時間間隔(ミリ秒)。デフォルトは5000ミリ秒です。
[名詞:] リアルタイムデータの更新回数

scコマンド

JVM によってロードされたクラス情報を確認します。 SC を使用すると、クラスがどの jar パッケージから読み取られたか、それがインターフェース/列挙クラスであるかどうかなど、さらにどのクラス ローダーからロードされたかなど、クラスの詳細情報を確認できます。

パラメータの説明:

パラメータ名詳細な説明
クラスパターンクラス名式のマッチング
メソッドパターンメソッド名式のマッチング
[d] このクラスによってロードされた元のファイル ソース、クラス宣言、ロードされた ClassLoader などの詳細情報を含む、現在のクラスの詳細情報を出力します。クラスが複数のClassLoaderによってロードされる場合、複数の
[E] 正規表現マッチングを有効にする。デフォルトはワイルドカードマッチング

sc -d *CardInfo: クラスの詳細情報を出力します

sc -d -f *CardInfo: クラスのフィールド情報を出力します

ヒープダンプ + jhat 分析

heapdump: jmapコマンドに似ている

指定されたフォルダに作成します:

  1. [arthas@365564]$ heapdump /usr/ local /mxn/dump.hprof ヒープ/usr/ local /mxn/dump.hprofダンプしています... ヒープダンプファイルが作成されました

作成が成功すると、指定したフォルダーに対応するダンプ ファイルが表示され、コマンド jhat dump.hprof を使用してファイルを生成できます。成功したら、IP+ポート経由でアクセスできるようになります

アクセス:

その後、IP + ポート経由でアクセスできるようになります。そこには「その他」が存在します。それを一番下まで引っ張ってみると

すべてのクラス(プラットフォームを含む)のインスタンス数を表示します

以下から、どのクラスに最も多くのオブジェクトが含まれているか、どのクラスが最も多くのオブジェクトを生成するかを分析できます。

最も強力な機能は、Execute Object Query Language (OQL) クエリと呼ばれ、どのオブジェクトが存在するか、オブジェクトが持つバイト数と参照数、どのオブジェクトに問題があるかを表示できます。下の図に示すように、文字列に対応するすべてのオブジェクトが表示されます。

検索後、このオブジェクトが占めるバイト数と、このオブジェクトを指す参照の数も確認できます。この OQL の構文も非常に柔軟です。 where条件を使ってフィルタリングすることができます

ジャド

jad: クラスの逆コンパイル、またはクラスのメソッドの逆コンパイル、動的プロキシ生成クラスの問題、サードパーティのクラスの検索 (コードの観察)、バージョンの問題 (提出された最新バージョンが使用されているかどうかの判断)

これは何の役に立つのか、私自身ソースコードを知らないのか、と疑問に思う人もいるかもしれません。なぜなら、オンライン環境またはテスト環境のパッケージが私たちによって変更されたかどうかわからないことがよくあるからです。この時点で、jadデコンパイルを使用して最新のコードかどうかを確認することができます。

再定義する

redafine: ホット置換、動的なコード更新、JVM を再起動する必要はありません。現在、いくつかの制限があります: メソッドの実装のみ変更できます (メソッドは完了まで実行されています)、メソッド名は変更できません、属性 m() -> mm() は変更できません

たとえば、オンライン環境のクラスに問題があり、それを置き換えたい場合、サーバーを停止して再公開するしかありません。これは普通の中小企業では可能ですが、JD.comやTaobaoのような大規模企業では、プロセス全体が非常に複雑であるため、止めることはできません。私たちは何をすべきでしょうか?次のケースをご覧ください

まず、新しいテストケースを作成します。

  1. パブリッククラスT{
  2. 公共 静的void main(String[] args)は例外をスローします{
  3. のために(;;){
  4. システム.in.read ( ) ;
  5. 新しいTT().m();
  6. }
  7. }
  8. }
  1. パブリッククラスTT{
  2. パブリックvoidm(){
  3. システム.out.println (2) ;
  4. }
  5. }

javac *.javaコマンドを使用してクラスファイルにコンパイルし、Tファイルを実行します。

  1. [root@VM-0-7-centos t]# java T
  2. 1つの
  3. 2
  4. 2

a を入力すると 2 が出力されますが、オンラインになった後、1 を出力する必要があることがわかります。ローカルで変更する場合は、オンラインで再リリースする必要があります。この変更には明らかに価値がありません。ただし、再定義ホットデプロイメントを使用すると、JVM を再リリースせずに直接置き換えることができます。

次にTプログラムをArthasに取り付けます

次にTT.javaプログラムvi TT.javaを直接変更し、そこに印刷された値を2から1に変更します。

  1. パブリッククラスTT{
  2. パブリックvoidm(){
  3. システム.out.println(1 ) ;
  4. }
  5. }

次にjavac TT.javaファイルをコンパイルして実行します。

マウントされたArthasに戻り、/usr/local/mxn/fuccGc/t/TT.classファイルを再定義します。

  1. [arthas@398842]$ redefine /usr/ local /mxn/fuccGc/t/TT.class 再定義成功、サイズ: 1、クラス: TT

実行成功 ご覧のとおり、再起動せずにクラスファイルイメージを正常に置き換えました。

時計

watch: メソッド実行のデータ監視。クラスを監視するには、watch コマンドを使用できます。監視後、関数を実行してシナリオを再現します。 Arthas は、トラブルシューティングに役立つ特定の出力および入力パラメータを提供します。

トレース

メソッド呼び出しパスと消費時間を出力します。この命令はコードの最適化に非常に役立ちます。各メソッドの具体的な実行時間を確認できます。 for ループなどの繰り返し文の場合は、最大消費時間、最小消費時間、n ループで消費された平均時間も確認できます。完璧!

tt

メソッドに対してttを有効にすると、各呼び出しの入力パラメータと戻りパラメータを記録し(監視回数の上限を設定できます)、これらの異なる時間調整を観察します。

  1. [arthas@405136]$ tt -t FullGCTest モデルフィット

コマンドパラメータ分析 -t tt コマンドには多くの主要なパラメータがあり、-t もその 1 つです。このパラメータは、クラス *Test の print メソッドの各実行を記録することを示します。 -n 3 呼び出し量の少ないメソッドを実行する場合は、CTRL+C を使用して tt コマンドの記録プロセスを中断するのに十分な時間があるかもしれませんが、呼び出し量が非常に多いメソッドに遭遇すると、JVM メモリが瞬時に爆発的に増加します。

このとき、-n パラメータを使用して、記録する必要がある回数を指定できます。記録数に達すると、Arthas は tt コマンドの記録プロセスを積極的に中断し、手動操作を停止できない状況を回避します。

ognl 式

ognl 式

OGNL の特殊な使用法については、以下を参照してください: https://github.com/alibaba/arthas/issues/71 OGNL 式の公式ガイド: https://commons.apache.org/proper/commons-ognl/language-guide.html

静的関数を呼び出す: ognl '@[email protected]("hello")' メソッド 静的クラスの静的フィールドを取得する: ognl '@FullGCTest@random' メソッド

Arthas は Web コンソールもサポートしています。https://alibaba.github.io/arthas/web-console.html を参照してください。

要約する

Arthas はオンライン デバッグ ツールです。他のツールと比較すると、Arthas はより包括的な機能を備えており、使いやすいです。初心者でも簡単に習得できます。記事の内容が理解できなかったり、質問がある場合は、下記にコメントを残してください。

<<:  分散システム調整カーネル - Zookeeper

>>:  富士通のSaaS攻撃で日本政府は崩壊

推薦する

SEO専門家の最適化戦略は外部リンクだけではない

SEO プロジェクトの計画には何が含まれますか?現在のクライアントの Web サイトに適した SEO...

過去 10 年間の SEO 開発を振り返ると、これが道の終わりなのでしょうか?

2012 年は魔法の数字です。それは世界の終わりと SEOER の終わりが予測されています。 SEO...

raksmart: 安価なサーバー (月額 60 ドルから)、ロサンゼルス データ センター、100M ~ 1Gbps の帯域幅、無制限のトラフィック

raksmart のロサンゼルス データ センターでは現在、安価な独立型サーバー (物理マシン) を...

SEOにおけるH1タグの役割についての簡単な説明

H1とH2は、HTML言語のごく基本的なものです。もともと、H1〜H6はタイトルのフォーマットを制御...

flipperhost - $5.75/4 コア/4g メモリ/125g ハードドライブ/10T トラフィック/ロサンゼルス

Flipperhost は 6 年前に登録された会社です。主な事業は仮想ホスティング、VPS、サーバ...

VirMach-$1/128m メモリ/5g SSD/100g フロー/10m ポート/ニューヨーク

VirMach のサーバーはバッファロー (ニューヨーク) でホストされており、将来的には他のデータ...

武漢 SEO ブログ: ウェブサイトを再構築する際に既存のランキングを保護する方法

最近、武漢 SEO ブログは、パフォーマンスを向上させるためにウェブサイトを再構築してほしいという友...

ウェブサイトの重量を素早く改善する方法

ウェブサイトが良いランキングを獲得したい場合、Baidu での重みを高める方法を見つける必要がありま...

クラウドコンピューティングの統合によりモバイルアプリのパフォーマンスを向上させる方法

世界中のユーザーの間でデジタル プラットフォームに対する需要が高まったため、モバイル アプリケーショ...

次の黄金の10年を迎え、クラウドコンピューティングは包括的な発展の時代に入る

クラウド コンピューティングは、新しいインフラストラクチャの重要な部分になりました。中国工業情報化部...

desivps: サンノゼ VPS、年間 18.99 ドル、1G メモリ/1 コア/25g SSD/1Gbps 帯域幅 + 無制限トラフィック、6 回の無料 IP 変更

desivps からプロモーション メールが届きました。基本的には、desivps が dedipa...

趣頭条がどん底に!

「我々は困難な変革期にある。成功しなければ、我々は消滅してしまうだろう」と、Qutoutiaoの内部...

ETag の概要と SEO におけるその応用

以前、「高性能ウェブサイト構築ガイド」でETagについて学んだことがありますが、実際に適用したことは...