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

推薦する

新年、あなたのブログはどのような新たな展開を迎えるでしょうか?

ブログはすでに繁栄したウェブサイトの形態であり、ウェブマスターの観点から見ても、ユーザーの観点から見...

Zhiqubaichuan: SCRMマーケティング自動化ソリューションのリーダー

[51CTO.com からのオリジナル記事] 大きな変動から利益を得ることは生物学の究極の能力です。...

Alibaba Cloudデータセンターのアップグレードにより、きめ細かなシナリオが深まり、新しい小売業のデジタル化が加速

9月18日、2020年雲奇カンファレンスにおいて、アリババクラウドのデータミドルウェア製品が全面的に...

ブログ9周年: 安定と継続的な発展を通じて成功を追求

この記事のタイトル画像は、2014年にネットユーザーからもらった碑文です。「初心を忘れるな」。私は今...

Google はどのようにコードレビューを行っていますか? コードレビューから何が得られますか?

この記事は海外雑誌IT Reviewより翻訳されたものです。原文リンクはこちら。私はもうGoogle...

Baidu が Aibang.com を買収すると報じられているが、Aibang.com はコメントを控えた。

Baidu が Aibang.com を買収すると報じられているが、Aibang.com はコメント...

クラウド コンピューティングは究極の破壊的イノベーションでしょうか?

クレイトン・クリステンセンのファンにとって、彼の「イノベーションのジレンマ」理論が 2011 年の今...

またまた受賞です! | H3CがGNTCカンファレンスで輝き、インテリジェントネットワークの革新をリード

10月22日から24日まで、国家次世代インターネットエンジニアリングセンターが主催し、南京江北新区...

テンセントクラウドが国際的なプロフェッショナルストリーミングメディア評価で認められる:3つのシナリオすべてでビデオエンコードのパフォーマンスが最適

ユニバーサルビデオの時代において、ビデオの品質、滑らかさ、帯域幅のストレージコストを決定するエンコー...

SosoがSogouに合併された後に残ったいくつかの疑問

今年の中国の検索エンジン業界は「一連の異例の現象」と言える。まず、360の自称第三世代検索エンジンが...

ホスティング - 10月はすべてのVPSが30%オフ/9年目のワンマンブランド

Hostigationは、ボスが1人しかおらず、ほぼ10年間VPSを運営しているという、特異なホステ...

ユニクロ:オンラインとオフラインを融合した「型破りな」ゲームプレイで、最も成熟したO2Oモデルを創出

ユニクロといえば、北京や上海などの都市の主要ショッピングモールに店舗が頻繁に出店していることに加え、...

王小川:攻撃を受けるインターネット大手からの生き残りのヒント

記者:ハン・ジチャン写真 | 王昭雑誌記者は、ネット界の新人で捜狗のCEOである王小川の人柄を、無神...

中小企業はどのようにしてAPP運用を成功させ、急速に成長できるのでしょうか?

モバイルインターネットの大きな波に乗って、ますます多くの企業がさまざまなモバイルマーケティングを実施...