JVM学習ノートとチューニング実戦(五):OOMテストインスタンスとメモリ表示ツールの使用

2820 ワード

ラベル:JVM
1、OOMテストの例:
package com.vechace.JVM;

import java.util.ArrayList;
import java.util.List;

/**
*  
* -XX:+HeapDumpOutOfMemoryError
* -XX:HeapDumpPath=d:\tmp\jvm.dump
* -XX:+PrintGCDetails
* -Xms10M
* -Xmx10M
* @author vechace
*
*/
public class JVMTest3 {

    public static void main(String[] args) {
        List lists = new ArrayList<>();
        
        for(int i=0;i<100000000;i++){
            lists.add(new byte[1024*1024]);
        }

    }

}

JVM構成の説明:
-XX:+HeapDumpOnOutOfMemoryError  : , dump 
-XX:HeapDumpPath=d:\tmp\jvm.dump2: dump d:\tmp\jvm.dump2
-XX:+PrintGCDetails: GC 
-Xms10M: 10M
-Xmx10M: 10M
  • 分析:
  • 一般的に、仮想マシンの初期スタックメモリは最大スタックメモリよりも小さくなりますが、最適化時には初期値-Xmsを最大値-Xmxまたは最大値に近づけることが多く、中間のGCメモリ計算プロセスを削減することを目的としています.
  • は、例えば、-Xmx 1 G、-Xms 256 Mを設定し、プログラムが実行されると、仮想機会がGCを継続し、新しいメモリを申請して新しいオブジェクトを保存し、1回のGCを行う効率が低く、時間がかかる.一方、-Xms 1 Gを直接設定すると、初期メモリから1 Gが割り当てられ、最大メモリと等しくなり、プログラム実行時に中間メモリ計算やGCプロセスが省け、効率が向上します.プログラムを実行した後、メモリ表示ツールvisualVMを開き、プログラムがエクスポートしたdumpファイルを表示します.結果は次の
  • です.

    dump
  • 結果分析:図から分かるように、プログラムにはバイト配列byte[]が現れ、92.7%のメモリを占有し、プログラム中のforサイクルに対応し、実際の開発過程でvisualVMを通じてメモリの割り当て状況を確認し、コードをチェックし、問題点を見つけることができる.

  • 2、StackOverflowスタックオーバーフロー:
    package com.vechace.JVM;
    
    /**
    * Description: 
    * @author vechace
    *
    */
    public class JVMTest4 {
        
        // 
        static int count = 0;
        /**
         *  
         */
        static void foo(){
            count++;
            foo();
        }
    
        public static void main(String[] args) {
            try{
                foo();
            }catch(Throwable t){
                System.out.println(count);
                t.printStackTrace();// , 
            }
    
        }
    
    }
    

    結果1:
    38084
    java.lang.StackOverflowError
        at com.vechace.JVM.JVMTest4.foo(JVMTest4.java:17)
        at com.vechace.JVM.JVMTest4.foo(JVMTest4.java:17)
        at com.vechace.JVM.JVMTest4.foo(JVMTest4.java:17)
        at com.vechace.JVM.JVMTest4.foo(JVMTest4.java:17)
        at com.vechace.JVM.JVMTest4.foo(JVMTest4.java:17)
        ......
    
    

    JVMパラメータ-Xss 512 Mを調整し、スタックの先頭メモリを512 Mに設定し、プログラムを実行します.
    結果2
    33526899
    java.lang.StackOverflowError
        at com.vechace.JVM.JVMTest4.foo(JVMTest4.java:17)
        at com.vechace.JVM.JVMTest4.foo(JVMTest4.java:17)
        at com.vechace.JVM.JVMTest4.foo(JVMTest4.java:17)
        at com.vechace.JVM.JVMTest4.foo(JVMTest4.java:17)
        at com.vechace.JVM.JVMTest4.foo(JVMTest4.java:17)
        at com.vechace.JVM.JVMTest4.foo(JVMTest4.java:17)
    
  • 分析:
  • によると、再帰呼び出し回数は明らかに増加しており、JVMチューニングでは-Xssも非常に重要なチューニングパラメータであり、-Xssチューニングの値が小さいとスレッドの同時数が多くなる(総メモリは変わらず、各スレッド分のメモリが少なく、スレッド数が自然に多くなる)
  • で-Xss変調が比較的大きい場合、スレッドの再帰深さは深く(メモリ分割が多く、呼び出しスタックの深さが深いほどスレッド数が少なくなる)、この値は経験値に属し、ビジネスと組み合わせて分析する必要がある.