テストパラメーター設定:
1.新しいa()を呼び出してヒープオーバーフローを達成するためにループ、java.lang.outofmemoryerror:javaヒープスペース、
仮想マシンパラメーター:-xms1m -xmx1m -xx:+heapdumponoutofmemoryerror、説明:-xmxと-xmsを同じに設定すると、ヒープの自動拡張を回避できます。 -xx:+heapdumponoutofmemoryerrorを使用すると、仮想マシンは、メモリオーバーフローの例外が発生したときに現在のヒープメモリダンプスナップショットをダンプできます。
// while(true){// new a()。do2(); //}2。オブジェクトの参照を呼び出してスタックオーバーフローを達成するためのループ。 Java.lang.StackoverFlowerror、
仮想マシンパラメーター:-XSS128K、
説明:仮想マシンスタックのサイズを128knに設定します
単一のスレッドでは、スタックフレームが大きすぎるか、仮想マシンスタック容量が小さすぎてメモリを割り当てることができないかに関係なく、上記のエラーがスローされます。
void do2(){do2();};3.文字列を呼び出すループ。Intern()メソッドは、定数プールに書き込み、定数プールがオーバーフローします。 java.lang.outofmemoryerror:permgenスペース
while(true){list.add(string.valueof(i ++)。intern()); }仮想マシンパラメーター:-xx:permsize = 10m -xx:maxpermsize = 10m、
説明:JVMによって最初に割り当てられた永久生成の容量と最大容量を示します。 (永久領域にはメモリが不十分であり、1.8以降にヒープにあります。メソッドエリア=永久生成、パーマンスペース」、つまり永続的な生成)
4つの参照状態:(クラスの継承が弱点<car>を拡張します)
1。強い引用:オブジェクトobj = new object()。強力な引用がまだ存在する限り、ガベージコレクターは参照されるオブジェクトを決して収集しません。
2。SoftReference:ソフトレファレンス、ソフト参照に関連付けられたオブジェクトは、メモリが不十分な場合にリサイクルされます。このリサイクルに十分なメモリがない場合、メモリオーバーフロー例外がスローされます。 softreference <byte []> sr = new softreference <byte []>(bytes);
3.弱い参照:弱いリファレンス、弱い参照に関連するオブジェクトは、次のゴミ収集までのみ生き残ることができます。
4。仮想参照:ファントマレファレンス、仮想参照は、オブジェクトのリサイクルステータスを追跡するために使用されます。
GCをトリガーする一時的な時間:
1.若い世代または古い世代がいっぱいになると、Java仮想マシンが新しいオブジェクトにメモリスペースを割り当てることができなくなると、Java仮想マシンはGCをトリガーして、使用されなくなるオブジェクトをリサイクルします。
2。System.gc()、runtime.getRuntime()。Gc()メソッドは通常、完全なGCと少なくとも1つのマイナーGCをトリガーし、すぐにリサイクルできない場合があります。
3.サーバーがアイドル状態になったとき、または高齢者がヒープにいるときにトリガーされます。
オブジェクト自体ではなく、参照されるオブジェクトで占めるスペースをリサイクルします。
しかし、それはまた、実際のゴミ収集メカニズムがアクション(オープンソース)を実行し始める時点で予測不可能です。これは、有効になるときの先制スレッドと同じ原則です。
世代のコレクションアルゴリズム:
新世代のコレクターとシニア世代コレクター。
マーククリアリングアルゴリズム
マーク - 組織化アルゴリズム
メモリオーバーフローとメモリリークの違い:
1。メモリオーバーフロー:メモリを割り当てるときに、プログラムには十分なスペースがありません。
2。メモリリーク:プログラムがメモリに適用された後、メモリを解放する方法はありません。それは常にメモリを占有します。つまり、割り当てられたオブジェクトに到達することができますが、役に立たないことです。メモリリークは通常、メモリ内の大きなオブジェクトによって引き起こされますが、リリースすることはできません。メモリオーバーフローを引き起こします。
並列と並行性:
1。並列:複数のガベージコレクタースレッドの操作を指します。
2。並行性:ユーザースレッドとガベージコレクタースレッドの動作を同時に指します。
クラスロードメカニズム:
1.ロード(Java.lang.Classオブジェクトの生成)、検証、準備、解析、初期化(割り当てプロセス)、使用(使用)、アンロード(アンロード)
2.確認(バイトストリームに含まれる情報が正しいかどうか、およびJVMに準拠しているかどうか)、
準備(クラス変数に値を割り当て、つまり静的変数、割り当て0)、
解析の3つの部分(シンボリック参照を直接参照に置き換え、クラスファイルをメモリに置き換えます)は、リンク(リンク)と集合的に呼ばれます
3。ロード段階:.classファイルのバイナリストリームを取得します。
クラス情報、静的変数、バイテコード、および定数の内容をメソッド領域に入れます
このクラスのメソッド領域のさまざまなデータのアクセスポータルとして、メモリ内のこの.classファイルを表すJava.lang.classオブジェクトを生成します。
4.初期化段階で行うことは、クライアント>メソッドを呼び出して、static変数をユーザー指定値に割り当て、静的コードブロックを実行することです。
親委任モデル:(クラスローダーを開始>拡張クラスローダー>アプリケーションクラスローダー>カスタムクラスローダー)
クラスローダーはクラスロードリクエストを受信し、リクエストを親クラスローダーに委任して完了します。親クラスが完了できなかった後にのみ、自分で完了します。
発生の原則:
Javaメモリの順序を制約するために、同期と揮発性のみに頼ることはできません。プログラムコールオーダールールに依存して、セッターとゲッターの順序を決定します。
マイナーGC:若いベルトメモリをクリーンアップし、新しいオブジェクトにスペースを割り当てることができません。
メジャーGC:それは老年を掃除することであり、多くの主要なGCはマイナーGCによって引き起こされます
フルGC:若い世代や古い世代を含むヒープスペース全体をクリーンアップすることです