インタビュアー:メモリリークとメモリオーバーフローのトラブルシューティング方法は?

ここに画像の説明を挿入

序文

まず、Javaヒープの構成を理解しましょう。ほとんどのアプリケーションでは、JavaヒープはJava仮想マシンロックによって管理される最大のメモリです。Javaヒープは、すべてのスレッドで共有されるメモリ領域であり、仮想マシンの起動時に作成されます。このメモリ領域の唯一の目的は、オブジェクトインスタンスを格納することです。ほとんどすべてのオブジェクトインスタンスは、ここにメモリを割り当てます。

ヒープの構造は次のとおり
ここに画像の説明を挿入
です。新世代と旧世代の具体的な分割比は次のとおりです。世代
ここに画像の説明を挿入
の主な機能は、メモリをより効率的に管理することです。

メモリリークとメモリオーバーフローは2つの異なる概念です

メモリリーク:オブジェクトは使用されなくなりましたが、メモリスペースを占有し、解放されていません。
メモリオーバーフロー:ヒープスペースが十分ではなく、通常はOutOfMemoryErrorとして表されます。メモリリークは通常、メモリオーバーフローにつながります。

JavaVisualVMを使用してヒープをリモートで分析します

jdkに付属のjvisualvmコマンドを使用して、ヒープの使用状況を分析できます。

記憶力が増すシーンをデモンストレーションするプログラムを書いてみましょう

public class OomDemo {
    
    

    private static final int NUM = 1024;

    public static void main(String[] args) throws InterruptedException {
    
    
        List<byte[]> list = Lists.newArrayList();
        for (int i = 0; i < NUM; i++) {
    
    
            TimeUnit.SECONDS.sleep(1);
            list.add(new byte[NUM * NUM]);
        }
    }
}

ここに画像の説明を挿入

コマンドラインでjvisualvmを実行すると、グラフィカルインターフェイスがポップアップ表示されます。マシン上のプログラムに接続し、リモートマシンに接続して、スナップショットファイルを分析および生成できます。

ヒープスペースが増加していることがはっきりとわかります。サンプラーを使用して、増加しているメモリのソースを分析します。
ここに画像の説明を挿入
いいやつ、バイト配列は実際には非常に多くのメモリを消費します

現時点でプログラムのどこに問題があるのか​​まだわからない場合は、[ヒープダンプ]ボタンをクリックしてタブを監視すると、ヒープスナップショットが生成され、ダンプファイルが分析されます。

ここに画像の説明を挿入
バイト配列インスタンスはほとんどありませんが、多くのメモリを消費します。特定の参照を
ここに画像の説明を挿入
確認すると、ArrayListで確認できます。

最後に、ヒープの使用状況を明確に確認し、ガベージ情報を収集できるプラグインVisualGCをお勧めします。
ツールをクリックしてプラグインを選択します
ここに画像の説明を挿入

ここに画像の説明を挿入
もちろん、jmapコマンドを使用してヒープダ​​ンプファイルを生成し、他のツールを使用して分析することもできます。

Java仮想マシンのパフォーマンス監視およびトラブルシューティングツール

Javaには、次のコマンドなど、Java仮想マシンの状態を分析するための実用的なコマンドが多数用意されています。

jps:実行中の仮想マシンプロセスを一覧表示し、仮想マシン実行のメインクラスを表示します

cis@mt002:~$ jps
70208 KmpService
183525 LinkAnalysisServer
25160 MipSerachServer

jmap(Java用メモリマップ):コマンドは、ヒープダンプスナップショット(一般にヒープダンプまたはダンプファイルと呼ばれます)を生成するために使用されます

OOMでスナップショットを生成するには、startupコマンドで次のパラメーターを構成します。これは、分析に便利です。

-XX:+HeapDumpOnOutOfMemoryError

jstack(Stack Trace for Java):現時点で仮想マシンのスレッドスナップショットを生成するJavaスタックトレースツール

スレッドのデッドロック、無限ループ、長時間待機しているスレッドの分析に使用できます

リファレンスブログ

[1] https://blog.csdn.net/qq_35190492/article/details/105376377
原油オーバーフローのいくつかの理由
[2] https://blog.csdn.net/cp_panda_5/article/details/79613870

おすすめ

転載: blog.csdn.net/zzti_erlie/article/details/114746000