JAva仮想マシンメモリオーバーフローおよび漏洩例

3151 ワード

テストパラメータの設定:
1、循環呼び出しnew A()はスタックオーバーフローを実現し、java.lang.OutOfMemoryError: Java heap space,
仮想マシンパラメータ:-Xms 1 M-Xmx 1 M-XX:+HeapDumpOnOutOfMemoryError、-Xmxと-Xmsを同じに設定すると、スタックの自動拡張を回避できます.-XX:+HeapDumpOnOutOfMemoryErrorは、メモリオーバーフロー異常が発生した場合に、現在のスタックメモリダンプスナップショットをDumpから取り出すことができます.

//    while (true){
//      new A().do2();
//    }

2、オブジェクト参照を循環的に呼び出す方式でスタックオーバーフローを実現する.java.lang.StackOverflowError,
VMパラメータ:-Xss 128 k、
説明:仮想マシンスタックのサイズを128 knに設定
単一スレッドでは、スタックフレームが大きすぎても仮想マシンスタックの容量が小さすぎても、メモリが割り当てられない場合は、以上のエラーが発生します.

void do2(){
  do2();
};

3、ループ呼び出しString.intern()メソッドは、定数プールを書き込み、定数プールがオーバーフローします.java.lang.OutOfMemoryError: PermGen space

while (true)
   {
     list.add(String.valueOf(i++).intern());
   }

VMパラメータ:-XX:PermSize=10 M-X: MaxPermSize=10 M、
説明:JVMが初期に割り当てられた永続世代の容量と最大容量を示します.(永続領域のメモリが不足し、1.8以降はスタック上にあります.メソッド領域=永続世代、PermGen space、すなわち永続世代)
4つの参照ステータス:(クラス継承extends WeakReference)
1、強引用:Object obj=new Object()は、強引用がまだ存在する限り、ゴミ収集器は参照されたオブジェクトを回収しません.
2、ソフトリファレンス:SoftReference、ソフトリファレンスに関連付けられたオブジェクトはメモリが足りないときに回収されます.今回の回収で十分なメモリがなければ、メモリオーバーフロー異常が放出されません.SoftReference sr = new SoftReference(bytes);
3、弱引用:WeakReference、弱引用に関連付けられたオブジェクトは次のゴミ回収までしか生存できない.
4、虚参照:PhantomReference、虚参照は追跡対象の回収状態である.
GCをトリガーするタイミング:
1、その年の軽世代あるいは古い世代がいっぱいになって、Java仮想機は更に新しいオブジェクトのためにメモリの空間を割り当てることができなくて、それではJava仮想機は1回GCをトリガーしてあれらのすでに使用されないオブジェクトを回収します
2、System.gc(),Runtime.getRuntime().gc()メソッドは、通常、1回のFull GCおよび少なくとも1回のMinor GCをトリガし、必ずしも直ちに回収するとは限らない.
3、現在のサーバーの空きやスタックの古い年代などの占有率が大きい場合にトリガーされます.
オブジェクト自体ではなく、参照オブジェクトが占有するスペースを回収します.
しかし、真のごみ回収メカニズムが具体的にどの時点で動作し始めるかは、同様に予想できない(オープンソースではない)ことであり、これはプリエンプト式のスレッドが作用するときの原理と同じである.
世代別収集アルゴリズム:
新世代コレクターと旧世代コレクター.
タグ-パージアルゴリズム
タグ→整理アルゴリズム
メモリオーバーフローとメモリリークの違い:
1、メモリオーバーフロー:プログラムはメモリを割り当てるときに十分なスペースがありません.
2、メモリ漏れ:プログラムはメモリを申請した後、メモリを解放することができず、常にメモリを占有している.すなわち、割り当てられたオブジェクトは到達できるが役に立たない.メモリの漏洩は、メモリに大きなオブジェクトがあるためですが、解放できません.メモリがオーバーフローします.
並列と同時:
1、並列:複数のゴミ収集器スレッドの運行を指す;
2、同時:ユーザースレッドとゴミ収集器スレッドが同時に動作することを指す.
クラスのロードメカニズム:
1、ロード(java.lang.classオブジェクトの生成)、検証、準備、解析、初期化(付与プロセス)、使用(Using)、アンインストール(Unloading)の7段階
2、検証(バイトストリームに含まれる情報が正しいか、jvmに合致しているか)、
準備(クラス変数、すなわち静的変数に値を付与し、0を付与する)、
解析(シンボル参照を直接参照、classファイルメモリに置き換える)3つの部分を総称して接続(Linking)と呼ぶ
3、ロードフェーズ:取得.classファイルのバイナリストリーム;
クラス情報、静的変数、バイトコード、定数等をclassファイルの内容をメソッド領域に挿入
これを表すメモリを生成する.classファイルのjava.lang.Classオブジェクトは、メソッド領域というクラスの様々なデータのアクセスエントリとして使用されます.
4、初期化フェーズで行うことはclient>メソッドを呼び出してstatic変数にユーザ指定の値を与え、静的コードブロックを実行することである.
親委任モデル:(クラス・ローダの起動>クラス・ローダの拡張>アプリケーション・クラス・ローダ>カスタム・クラス・ローダ)
1つのクラス・ローダはクラス・ロードのリクエストを受信し、このリクエストを親クラス・ローダに委任して完了させ、親クラスが完了しなければ、自分で完了しません.
先行発生原則:
Javaメモリの秩序性はsynchronizedとvolatileによって制約されるだけではだめであり,プログラム呼び出し順序規則によってsetterとgetter順序を判断する.
Minor GC:若いメモリをクリーンアップし、新しいオブジェクトにスペースを割り当てることができません.
Major GC:古い時代を整理し、多くのMajor GCはMinor GCによってトリガーされた.
Full GC:若い世代と古い世代を含めて、スタック全体の空間を整理します.