JVMメモリを監視しないキャリアは不完全です

JVMメモリを監視しないキャリアは不完全です

[[393678]]

この記事はWeChatの公開アカウント「New Vision of Programming」から転載したもので、著者はUgly Fat Man Second Brotherです。記事の転載については、Program New Visionの公式アカウントまでご連絡ください。

序文

長年 Java 開発に携わってきたものの、JVM 分析ツールを使用したことがなく、JVM ダンプ ログを通じて障害の特定やパフォーマンスの最適化を試みたことがないのであれば、これはキャリアにおける大きな後悔であり、能力不足であると言えます。

この記事は、JDK に付属するツール (VisualVM) に基づいており、メモリ オーバーフローのケースを記述して、JVM 分析を開始する方法を示します。この記事には複数の知識ポイントの統合と実践的な経験の共有が含まれており、読者は注目することができます。

VisualVM の紹介

VisualVM は、JDK6.0 アップデート 7 に付属する Netbeans のプロファイル サブプロジェクトです。スレッド、メモリの状態を監視し、メソッドの CPU 時間やメモリ内のオブジェクト、GC されたオブジェクトを表示し、割り当てられたスタックを逆に表示できます (たとえば、どのオブジェクトがそれぞれ 100 個の String オブジェクトを割り当てたか)。

クラスパスが正しく設定されていれば、VisualVM の起動は非常に簡単です。コマンドラインに jvisualvm と入力するだけで、グラフィカル インターフェイスが起動します。 VisualVM はローカル監視だけでなく、リモート監視もサポートします。

リモート監視の構成は少し複雑なので、ローカル監視を例としてデモンストレーションを行います。実稼働環境では、リモート監視を選択することも、jmap を使用してダンプ ファイルを生成し、そのダンプ ファイルをダウンロードして分析することもできます。

VisualVM 関数インターフェイス

VisualVM を起動したら、JVM 分析に役立ついくつかの機能を見てみましょう。ここでは、地元で始まったアイデアを例として取り上げて説明します。

概要

VisualVM に入った後、左側の対応するプロセスをクリックすると、最初に表示されるのは [概要] の内容です。

概要には、JVM、Java バージョン、ダンプ バッチなどの情報が表示されます。実際の戦闘では、この情報を使用して情報を検証できます。特に、JVM パラメータとシステム プロパティを確認してください。

かつて、Java プログラムの起動時に JVM パラメータの場所が誤って記述され、JVM パラメータが有効にならないというシナリオに遭遇しました。

例えば、以下の手順では、JVM パラメータが最後に記述されているため、パラメータ設定は無効になります。

  1. java -jar app.jar -Xms256m -Xmx512m

正しい書き方は次のとおりです。

  1. java -Xms256m -Xmx512m -jar app.jar

上記の場合、ツールは JVM パラメータ項目に指定されたパラメータ値がないことを簡単に表示できます。

監視

監視インターフェースは、より一般的に使用されるインターフェースです。このインターフェースを通じて、CPU 使用率、ヒープおよびメタスペースの使用率、スレッドの使用率、クラスの読み込みステータスなどを表示できます。

ヒープとメタスペースの使用状況を分析することで、対応するメモリ空間の使用状況と増加を確認し、適切な調整と計画を立てることができます。

右上隅の「ヒープ ダンプ」をクリックすると、クリックした時間ノードに基づいてダンプ ファイルが生成されます。

概要セクションには、生成されたダンプ ファイルのタイム ノードとストレージ パスが表示されます。メモリを分析するために主に使用するものは、このページの「クラス」メニューにあります。

ヒープ内のさまざまなインスタンスによって占有されているメモリ サイズを表示するには、入力します。クラス名をダブルクリックすると、特定のクラスのインスタンスの詳細である「インスタンス数」が表示されます。

メモリ分析において私たちにとって最も重要なのは、実は「クラス」の数です。上記の基本的な操作を理解した後、例を使用してメモリ オーバーフローのシナリオをシミュレートして分析してみましょう。

メモリオーバーフローシナリオ構築

まず、メモリ オーバーフローをシミュレートするコードを記述します。つまり、マップを作成し、それにオブジェクトを継続的に追加します。同時に、プログラム処理中にスレッドをスリープまたはデッド ループにして、VisualVM での表示を容易にします。

テストコードは次のとおりです。

  1. パブリッククラス MemoryLeakTest {
  2.  
  3. /**
  4. * キャッシュオブジェクトを宣言する
  5. */
  6. プライベート静的最終 Map<String, TestMemory> CACHE_MAP = new HashMap<>();
  7.  
  8. 公共 静的void main(String[] args) {
  9. 試す {
  10. //visualVm を開く時間を与える
  11. スレッドをスリープ状態にします(10000);
  12. } キャッチ (InterruptedException e) {
  13. e.printStackTrace();
  14. }
  15. // キャッシュにオブジェクトを追加するためのループ
  16. ( int i = 0; i < 1000000; i++) {
  17. テストメモリ t = 新しいテストメモリ();
  18. CACHE_MAP.put( "キー" + i, t);
  19. }
  20. システム。出力.println( "-------1------" );
  21. // ヒープをダンプするための時間を提供する
  22. 試す {
  23. //visualVm を開く時間を与える
  24. スレッドをスリープ状態にします(10000);
  25. } キャッチ (InterruptedException e) {
  26. e.printStackTrace();
  27. }
  28.  
  29. ( int i=0; i<1000000; i++) {
  30. テストメモリ t = 新しいテストメモリ();
  31. CACHE_MAP.put( "キー" +i,t);
  32. }
  33. }
  34. }

TestMemory クラスは、生成されるビジネス クラスを表します。

  1. パブリッククラスTestMemory {
  2. }

プログラムがより早くメモリしきい値に到達できるように、起動時に JVM のサイズを制限することができます。ここでは次のように設定されています:

  1. -Xms128m -Xmx128m

また、ヒープのメモリ構造における各領域(新世代、旧世代)のメモリ使用量を分析するために、VisualVM の「ツール」および「プラグイン」にある Visual GC プラグインをインストールすることができます。このプラグインを使用した効果は後で確認できます。

準備は整いました。確認してみましょう。

メモリオーバーフロー解析

次に、プログラムを起動し、VisualVM を起動してメモリ オーバーフローを分析します。

プログラムを実行すると、「ヒープ」メモリが急速に増加する曲線を示すことがわかります。

Metaspace もこの過程で成長しています。

Visual GC インターフェイスを開くと、インタビューで何度も尋ねられたヒープ メモリ構造が表示されます。

この図から、ヒープメモリ内の旧世代、新世代、Metaspace 空間 (JDK8) のほか、新世代内の Eden、S0 (Survivor From)、S1 (Survivor To) が直感的にわかり、その割り当て比率もより直感的に表示されます。この方法では、ヒープメモリ構造をより直感的に学習できるでしょうか?

ここで、Eden はいっぱい、S0 と S1 は空、古い世代はほぼいっぱいです (ガベージ コレクションでは参照を保持しているオブジェクトをクリアできないため)。

最も重要なことは、20 分間に古い世代で 3850 回のガベージ コレクションが実行されたことです。つまり、Full GC 操作が頻繁にトリガーされ、メモリが解放されていません。実稼働システムで、システムが Full GC 操作を頻繁に実行しているのがわかる場合、それは JVM が非常に危険な信号を送信していることを意味します。

上記では表面的な部分について説明しましたが、ここからは実際にメモリ分析を始めます。上記の「モニター」、「ヒープ ダンプ」、「クラス」に戻ると、次の図が表示されます。

ご覧のとおり、ヒープには 100 万個の TestMemory オブジェクトがあります。ヒープ内にこのようなオブジェクトが多数ある場合は、メモリ リークが発生している可能性があることに注意する必要があります。つまり、大量のオブジェクトが作成されますが、「スムーズに」リサイクルされるわけではありません。ここでリサイクルされない理由は、オブジェクトが静的変数に配置されているためです。

前述のように、オブジェクト名をダブルクリックすると、オブジェクトの詳細情報を表示できます。

上記の手順により、基本的にどのオブジェクトに処理上の問題があるかを特定できます。この時点で、コードに戻って対応するコードをチェックし、メモリ オーバーフローの問題をすばやく見つけることができます。その中でも、上記のプロセスで VisualVM によって提供されるアラーム信号とデータの表示には特に注意を払う必要があります。

まとめ

この記事では、VisualVM の使用、オンライン JVM のトラブルシューティング、JVM のメモリ構造、メモリ オーバーフロー (バグ) シナリオの構築方法について説明します。しかし、何を言うかは重要ではありません。重要なのは、この記事を通じて何を確認し、学び、得たかを確認することです。

<<:  気をつけてください、あなたの声が盗まれます!テンセント朱雀研究所の最新研究結果が明らかに:音声セキュリティを過小評価すべきではない

>>:  世界中の 800 人以上の貢献者が協力して OpenStack バージョン 23 をリリース – Wallaby

推薦する

デスクトップ仮想化についてすぐに習得すべき 8 つの問題

デスクトップ仮想化テクノロジは、セキュリティ、管理性、柔軟性を向上させることが期待されているため、関...

エッジ コンピューティング、クラウド コンピューティング、フォグ コンピューティングは自動運転に何をもたらすのでしょうか?

エッジコンピューティング、フォグコンピューティング、クラウドコンピューティングは自動運転の分野でどの...

Zhihu: 有料の知識か広告か?

最近、Duode は深セン証券取引所の成長企業市場に目論見書を提出しました。興味深いことに、この知識...

「タオバオ大学」をめぐる論争:人材育成か「ベンダー」の模倣か

アリワンワンの特徴的な「ピンポーン」という音とともに、店主は客に挨拶を始めました。「おや、何をお求め...

無制限トラフィック VPS: limewave、米国 VPS (シアトル)、最小構成 $20/月、4 RAM/2 コア/50GSSD/100M 帯域幅

Limewave は独自のネットワーク AS36369 と IP を持っています。現在はインターネッ...

検索エンジンスパイダーの原理の詳細な分析

私はウェブマスターと頻繁にやり取りしており、定期的に A5 Chat Webmaster Recor...

imidc: 「双方向」南アフリカ cn2 vps の簡単なレビュー。十分ではないと思われる場合は、専用サーバーを使用することもできます。

現在、欧米のCN2ネットワークは圧迫されており、帯域幅のコストも急騰しています。アジアのCN2の価格...

ニッチなチャンネルの検索とプロモーションのヒント

比較的シンプルな製品と機能を備えた小規模な検索チャネルである Shenma にとって、プロモーション...

Kubernetes を大規模に保護するための 3 つの重要なポイント

[51CTO.com クイック翻訳] Kubernetes コンテナはマルチクラウド環境で非常に人気...

Baidu は意図せず 2 位にランクイン。ソーシャル コンテンツは本当に SEO に取って代わるのでしょうか?

今日の午後、百度で会社のメインキーワード「ウェディングトレーニング」のランキングをチェックしたところ...

hostus-$13.5/768m メモリ/768MvSwap/20g ハードディスク/2T トラフィック

最近、便利なものが見つからなかったため、Hostus の低価格で安価なものをいくつか投稿します。年間...

ベンチャーキャピタルに不満を抱き、共同購入サイトは利益を求めている

ベンチャーキャピタルに依存して急速に拡大し、市場シェアを獲得した共同購入ウェブサイトは、短期的な株式...

アップデートは停止しましたか? Baidu Shareはメンテナンスされていないようです

看看GPS地図网のウェブマスターによると、Baidu Shareは更新を停止した可能性があります。そ...