序文
まず、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