JVM ランタイム データ領域、一般的な JVM 例外の例

JVM ランタイム データ領域:

  • Java プログラムの実行中、Java 仮想マシンは管理するメモリをいくつかの異なるデータ領域に分割します。

ヒープ:

  • スレッドの共有
  • ストレージ: 最も多く作成され实例对象、、、数组;字符串常量池
  • 説明:
    - オブジェクト参照は に保存され、ヒープ内でオブジェクトが保存されているアドレスを指します。 - ヒープ メモリ内のオブジェクトは独自のメンバー変数を保存し、フレーム スタックに保存される
    オブジェクトのメソッドは保存しません。方法
  • パラメータ: -Xms1G- 初期ヒープ メモリ-Xmx1G- 最大ヒープ メモリ、デフォルト サイズ
    - デフォルトの初期値、64/1最大物理メモリ1/4、8G のメモリに基づいて計算されます。128M ~ 2G
  • メモリのリサイクル: 新世代、旧世代 - 1:2; 新世代:eden 、s1 、s2 - 8:1:1
  • リサイクル アルゴリズム:
    – 新しい世代复制算法: 利用可能な新しい世代のメモリを 2 つの領域 s1 と s2 に分割します。一度に 1 つの領域のみが使用されます。1 つの領域がリサイクルされると、この領域に残っているオブジェクトは別の領域にコピーされ、領域が空になります。現在の領域eden + s1 - > s2 , eden + s2 ->1
    - 古い世代标记压缩: ルート ノードからすべての参照オブジェクトをマークし、すべての生き残ったオブジェクトを圧縮してメモリの一端に移動し、残りのガベージ オブジェクトをクリアします。

1
2

ヒープメモリオーバーフロー( java.lang.OutOfMemoryError)

リスト ループの追加は通常、次の場所に表示されます。大批量添加数据

  • すべて一般的。リストをバッチで追加し、データベースにインポートします。
		List<User> list=new ArrayList<>();
        while(true){
    
    
            list.add(new User().setName("小树"));
        }

大きなファイル IO を処理する場合:

//size 声明 多 ~~大 ,比如: new byte[in.available()];
byte[] buffer = new byte[size] //1024 * 1024 * 5

例外処理: このタイプの例外をキャッチするには、それを使用しThrowable e、それに応じて処理します。

		try {
    
    
			//TODO
        } catch (Throwable e) {
    
    
            e.printStackTrace();
        }

Java仮想マシンスタック:

  • スレッドのプライベート領域はスレッドと同じライフサイクルを持ち、各メソッドが実行されると、Java 仮想マシンはスタック フレーム (Stack Frame) を同期的に作成します。
  • ストレージ: スタック フレームには、メソッドのローカル変数テーブル、オペランド スタック、動的接続、およびメソッドの戻りアドレスが格納されます。
  • プロセス: 呼び出される各メソッドから実行の完了までのプロセスは、仮想マシン スタック内のこのスタック フレームのプロセスに対応します。入栈から撮影されたスクリーンショット:アドレス出栈
  • パラメータ:-Xss<size>
    1

スタックオーバーフロー( java.lang.StackOverflowError):

  • メソッドが再帰的に呼び出されています。メソッド呼び出しレベルが深すぎるため、新しいスタック フレームを作成するにはメモリが不足しています。
private static int count;

    public static void count(){
    
    
        try {
    
    
            count++;
            count();
        } catch (Throwable e) {
    
    
            System.out.println("最大深度:"+count);
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
    
    
        count();
    }

メソッド領域: Java クラス情報、ランタイム定数プール、静的変数

  • JDK1.7以前は永続Perm世代と呼ばれます堆中ストレージ: Java クラス情報、ランタイム定数プール、静的変数、ジャストインタイム コンパイラによってコンパイルされたコード、およびその他のデータ
  • JDK 1.8 (元空间 MetaSpaceでと呼ばれます) 直接内存中ストレージ: クラス情報と定数プールはローカル メモリに配置され、定数プールと静的変数は Java ヒープに配置されます。
  • パラメータ:-XX:MaxMetaspaceSize

プログラム カウンタ: スレッド切り替え後に通常の実行位置に戻るために、現在のスレッド ロックによって実行されているバイトコード命令のアドレスを保存します。

ネイティブ メソッド スタック: ネイティブ メソッド JNI は、Java を使用して、C および C++ で実装されたローカル メソッド ライブラリを呼び出します。

おすすめ

転載: blog.csdn.net/hesqlplus730/article/details/123760581