JavaでのOOMの問題

OOMとは

OOMは「OutOfMemory」の略で、メモリオーバーフローを意味します。Javaのオブジェクトはヒープ上に作成されることがわかっていますが、ヒープメモリが不足して新しく作成されたオブジェクトにスペースを割り当てると、OutOfMemoryErrorが生成されます。

OOMを選ぶ理由

GCメカニズムが存在するため、Javaプログラマーはメモリの割り当てとリサイクルにあまり注意を払う必要がなく、GCは「到達可能性分析」を使用してオブジェクトをリサイクルする必要があるかどうかを判断します。

到達可能性分析:GCは最初にGCルートノードのグループ(通常、JVMが保持するオブジェクトなどのいくつかのグローバル要素)を決定し、次にGCルートがオブジェクトへの参照チェーンまたは参照チェーンを保持しているかどうかに基づいてこのオブジェクトを判断します「到達可能」かどうか。

GCはほとんどの不要なオブジェクトをリサイクルします。OOMが発生した場合、通常2つのケースがあります。

  1. JVMヒープメモリが本当に不足しています
  2. コードの問題

ヒープメモリが不足している場合は、ヒープメモリを拡張してください。ただし、ほとんどの場合、OOMはコードの問題が原因で発生します。つまり、リサイクルされるべき多くのオブジェクトがリサイクルされず、ヒープメモリが不十分になります。

OOMへの対処方法

  1. OOMの問題に対処する鍵は、ヒープダンプ(ヒープダンプファイル)を取得することです。これにより、特定の時間にJVMヒープ内のオブジェクトのメモリ使用量が節約されます。ヒープダンプファイルは、次の方法で取得できます。

    • プログラムを開始する前に、JVMパラメータを追加します
    -XX:+HeapDumpOnOutOfMemoryError
    

    このパラメーターの意味は次のとおりです。OOMが発生すると、ヒープダンプファイルが生成されます。

    • プログラムの実行中は、jmapを介して取得されます。最初にjpsを介してJavaプロセスのpidを取得し、次にjmapを介してダンプファイルを出力します。
    jmap -dump:live,format=b,file=<filepath> <pid>
    

    filepathはダンプファイルが生成される場所で、pidは分析するJavaプロセスのpidです。

  2. ダンプファイルを取得したら、いくつかのグラフィカルツールを使用してそれを分析できます。一般的に使用されるグラフィック薬品には、ビジュアルVM、MAT、JProfilerなどがあります。

栗をあげる

  1. まず、プログラムを記述し、JVMの最大ヒープメモリを128Mに設定します。これにより、一定期間後にそれがOOMになり、仮想VMを使用して簡単に分析できます。
-Xmx128m
import java.util.ArrayList;
import java.util.List;

public class OOMExample {
    public static void main(String[] args) throws InterruptedException {
        List<byte[]> list = new ArrayList<>();
        for(int i=0;i<128;i++){
            list.add(new byte[1024*1024]);
            Thread.sleep(500);
        }
    }
}
  1. 操作中に、コマンドラインでjpsと入力すると、現在のプロセスpidを取得できます。仮想VMを介して直接表示することもできます(私はpidが不整合になるようにイメージを2回分割しようとしています)。

image-20200422005307131

image-20200422005510311

  1. 仮想VMを介してプログラムのリアルタイム実行を確認できます。通常の状況では、プログラムのメモリ曲線は波打っていて、プログラムはOOMを実行しようとしています。

img

  1. jmapからダンプファイルを取得する
jmap -dump:live,format=b,file="/12844.hprof" 12844
  1. 仮想VMを使用してダンプファイルを表示する

image-20200422010042425

バイト配列がメモリの大部分を占めていることは明らかであり、これは予想と一致しています。実際のシナリオでは、OOMのオブジェクト参照関係はこれよりもはるかに複雑です。特定の問題の具体的な分析、問題のコードをすばやく見つける方法も問題です。この記事はガイドとして使用してください。

おすすめ

転載: www.cnblogs.com/2511zzZ/p/12749312.html