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

推薦する

host1plus の 10G ポート Linux VPS に Windows システムをインストールする

一昨日、host1plusの10Gポートクラウドサーバーが50%割引のプロモーション中であることを紹...

Tudou.comは本日ナスダックから上場廃止、CEOの王偉氏が退任を発表

テンセントテクノロジーニュース(越谷小北)北京時間8月24日、海外メディアの報道によると、Youku...

alphavps-35 ユーロ/2xL5630/16g メモリ/450gSAS/5T トラフィック/5IP/ブルガリア

DA International Group Ltd. のブランドである alphavps.bg は...

Ele.me の軽量分散時系列データベースの設計と調査!

著者について: Huang Jie は2015 年に Ele.me に入社し、現在はフレームワーク ...

3年間の運営経験: タオバオSEOランキング最適化のヒント

1. キーワードの選択2. タイトルデザインとキーワードの組み合わせ3. 画期的なキーワードを特定す...

ニュース: EIG グループに似たコンソーシアム、Missgroup!

Missgroupは2009年に設立され、急速に発展してきました。簡単に言えば、ドメイン名、SSL、...

世界のエッジコンピューティング市場は2028年までに600億ドルを超えると予測

Grand View Research が発表した新しいレポートによると、大量のデータ転送に関連する...

テンセントチャリティーは、99チャリティーデーの人気を年間を通じて拡大し、慈善の二重の「エンジン」の構築を目指しています。

「感染症との戦いは、デジタル技術と社会福祉の融合を加速させている」と、テンセント財団の葛炎事務局長は...

hostyunの香港荃湾データセンターAMD高性能シリーズVPSの簡単なレビュー

Hostyunは香港の荃湾データセンターに新しいAMD高性能シリーズを追加しました。このシリーズは「...

ウェブ編集者必携:検索エンジン最適化の基本要素

1. 良いコンテンツを作成するGoogle で良いランキングを獲得したいなら、まず自分自身に問いかけ...

会話型ソフトウェア開発について

大規模な言語モデルを活用してコードを生成することは、人生を変える一つの方法ですが、ソフトウェア開発プ...

SEOは検索エンジンだけを考慮するだけでは不十分

ウェブサイトのプロモーションと最適化における SEO (検索エンジン最適化) の現状をどのように捉え...

Oracle、Oracle Autonomous Transaction Processingを発表

オラクルの会長兼 CTO ラリー・エリソンは本日、Oracle Autonomous Transac...

コンテナは企業のクラウド移行を加速する近道

今日では、コンテナ、マイクロサービス、クラウド ネイティブなどのテクノロジーによって推進されるデジタ...