Javaメモリ分析
前書き
Javaプログラムをサーバー側で実行している場合、長時間実行したり、アクセス量が多いと、メモリオーバーフローが発生します。
このとき、JVMのメモリ解析を行わないと問題を特定できないため、サーバーを再起動しても、その後の運用でメモリオーバーフローが発生することが予想されます。
次に、実際の状況を組み合わせ、いくつかの例を使用して、メモリオーバーフローの状況とその分析方法をシミュレートします。
テキスト
1.メモリオーバーフローをシミュレートします
1.1新しいBeanオブジェクトを作成する
package com.moonl.jvm.beans;
public class MemoryOverflow {
}
1.2プログラムを実行するためのメインメソッドを構築する
package com.moonl.jvm;
import com.moonl.jvm.beans.MemoryOverflow;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.ArrayList;
import java.util.List;
@SpringBootTest
public class MemoryOverflowTest {
public static void main(String[] args) {
List<MemoryOverflow> list = new ArrayList<>();
while (true){
list.add(new MemoryOverflow());
}
}
}
1.3ランタイムメモリを設定する
ここでは、ランタイムメモリを21Mに設定し
、プログラムの実行を開始します。
この時点で、非常に単純なコードである無限ループが引き続きオブジェクトを作成してリストに追加します。この時点で、エラーメッセージとメモリオーバーフローが見つかりました。
実稼働環境では、システムのバックグラウンドでのメモリオーバーフローがシミュレートされました。
2.位置決めの問題
比較的大規模なシステムに直面している本番環境でメモリオーバーフローが発生した場合、通常、ログからメモリオーバーフローの場所を特定することは不可能であるため、実行時にパラメータを追加して、実行時のメモリオーバーフローのスナップショットを生成する必要があります。 。
-Xms21m -Xmx21m -XX:+ HeapDumpOnOutOfMemoryError(
図を参照):
実行後、図のように表示され
ます。プログラムのプロジェクトカタログレポートで、生成されたばかりのファイルのスナップショットを見つけることができますが、ファイルを読み取る方法では、クエリ用に別のツールをダウンロードする必要があります。
ここで使用するのは、Jprofilerは誰でもダウンロードでき、インストールプロセスは繰り返されないということです。
3.メモリオーバーフローの原因を分析します
[ Jprofiler ] - [セッション] - [スナップショットを開く]ダイアログボックスを開いた後、分析するファイル
を選択すると、メモリオーバーフローの原因を確認できます。もちろん、実稼働環境でメモリオーバーフローを分析する場合は、調査および分析する場所が他にもあります。
追記
要約すると、この記事で説明する方法は、vmオプションに
HeapDumpOnOutOfMemoryErrorを追加して(-Xms21m -Xmx21m -XX:+ HeapDumpOnOutOfMemoryError)、スナップショットログを生成することです。次の号では、ideaとjprofilerによる統合について説明します。
メモリの動作状態。
次の記事-JAVAメモリ分析:アイデアはjprofilerを統合してJVMメモリ使用量を表示します