JVM関連の知識の概要
1. JVMメモリ構造及び管理機構
- プログラムカウンタは:各スレッドは、スレッドが作成されたときに作成したPCレジスタを持っています。次の命令のアドレスを指します。地元のメソッドを実行する場合、PCが定義されていません。
- 方法エリア:店舗情報をロードされたクラス、タイプ定数プール、フィールド方式情報、メソッドのバイトコード。
- ヒープメモリ:新しいオブジェクトは、Javaヒープに格納され、すべてのスレッドがJavaヒープを共有し、世代別GCの、ヒープは、世代であり、GCの主要な地域の管理。
- スタックメモリ:プライベートスレッド、ライフサイクルと同じスレッド、スタックは、一連のフレームで構成され、フレームのローカル変数の方法、オペランドスタック、定数プールポインタ、フレームを作成し、スタックにプッシュするためにあらゆるメソッド呼び出し。
- ネイティブメソッドスタック:領域のアドレスを入力するようにネイティブメソッドを保存します。各ネイティブメソッド呼び出しの状態を保存する方法を実行するためのネイティブサポート。
2. JVMのライフサイクル
出産のJVMインスタンス:
Javaプログラムを起動するとき、JVMインスタンスは、パブリック静的な無効メイン(文字列[]引数)クラス機能を有する誰もが、出発点JVMインスタンスランニングとして使用することができ、生じます。
JVMインスタンスが実行します。
メイン()プログラムは、スレッドの初期出発点として、他のスレッドは、スレッドによって開始します。内部JVM 2件のスレッドがあります)(メイン、スレッドガードと非デーモンスレッドを非スレッドデーモン、通常JVM自体によって使用されるデーモン・スレッドです。Javaプログラムを使用すると、デーモンスレッドとしてスレッドを作成していることを示すことができます。
JVMインスタンスの終焉:
すべての非デーモンスレッドの手続きが終了している場合、JVMは終了し、セキュリティマネージャが許すならば、プログラムは終了する)java.lang.Runtimeクラスまたはjava.lang.System.exit(することができます。
3. JVMガベージコレクションのメカニズム
まず、決定何時トリガーでGCが続く、オブジェクトが生き残ったかどうかを判断し、最後の対応使用ガベージコレクションのアルゴリズムゴミのために。
GC何時トリガー:
アプリケーションがアイドル状態のときに、最も低い優先度のスレッドでのGCの実行は、一般的に呼ばれています。ときにメモリ不足がコールするためのイニシアチブをとるだろう。
オブジェクトは、世代プロセスので、ガベージコレクションのゾーンではなく、同じ時間があるため。2つのGCがあります。
- GCヤングは:オブジェクトの割り当てが失敗した場合、それは若いGCをトリガし、通常の状況下では、若い世代のオブジェクトを割り当てることを試みます。
- フルGC:フルGCの数を最小限に抑える必要があります遅くヤングGCより詳しいGCので、そのため、若い世代、歳と永久世代を含め、全体のメモリの統合を行っています。
オブジェクトが生存しているかどうかを決定します:
- 参照カウント:ヒープはオブジェクトを作成できません、それは、デフォルトの初期値をオブジェクトのカウンタを作成します。他の変数は、オブジェクトの参照を割り当てられている場合、値がインクリメントされます。オブジェクトまたは死亡のインスタンスへの参照は、新しい値を割り当てるときに、カウンタがデクリメントされます。
- 到達可能性解析アルゴリズム:GcRoot開始から、対応する基準ノードを見つけるには、ノードが発見された後に、この参照ノードを探し続けて、すべての参照ノードを探しているが完了した後、残りのノードは、ノードは無用であること、引用されていないと考えられていますノードは、ノードが無駄リサイクルオブジェクトとして判定されます。
JavaはGcRootとして使用することができ、次のカテゴリに分類されます
- VMのスタック参照オブジェクト
- メソッド静的プロパティクラスオブジェクトは、領域によって参照します
- 一定の基準物体領域の方法
- オブジェクトのネイティブメソッドスタックアプリケーション
一般的なガベージコレクションアルゴリズム:
- マーク-クリア方法:GcRootからスタート検索の説明は、生き残ったオブジェクトがマークされています。マーキングした後、再スキャンオブジェクト全体が空間にマークされていない、ガベージコレクション。この方法は、メモリの断片化を引き起こすことは容易です。
- マーク-照合アルゴリズム:アルゴリズムとマーク-スイープアルゴリズムは同じですが、完了マークの後に、直接オブジェクトをクリーンアップするためにリサイクルしませんが、オブジェクトはすべて1つの端まで移動生き残る、その後、境界を越えてメモリを一掃します。
- マーク-複製アルゴリズム:これは、メモリは二つの等しいサイズに分割され、それらの一方のみを使用しています。それはメモリ不足、そしてそれは、上側ブロックBにコピーされたライブオブジェクト、およびメモリブロックA使い捨てクリーンアウトもなります速いです。このアルゴリズムは簡単で、効率的な操作と少ないメモリの断片化が、メモリ空間の使用ですが、スペースが半分に低減することができるので、その後、高価格を作ったが。もちろん、複製アルゴリズムの効率で生きているオブジェクトの数は、多くのオブジェクトが、その後、効率が大幅に削減されます場合は偉大な関連性、生存率を持っています。
- 世代別コレクションアルゴリズム:世代コレクションアルゴリズム現在最もJVMのガベージコレクタが使用するアルゴリズムです。核となるアイデアは、生きているライフサイクルのメモリは、複数の異なる領域に分割されたオブジェクトに基づいています。彼らは若い世代、歳と永久の世代に分割されます。そして、収集領域に応じて適切なアルゴリズムを使用します。
4.一般的なガベージコレクタ
CMSコレクタ(マーク - スイープアルゴリズム)
CMS収集プロセス:
- 初期ラベル(CMS-初期マーク)、STWを引き起こす可能性があります。
- 並行マーク(CMS-同時マーク)、およびユーザーのスレッドを同時に実行します。
- ユーザスレッドを同時に実行(CMS-同時-予備洗浄)を、前洗浄;
- スレッドがユーザーと並行して実行(CMS-同時-abortable-プレクリーン)プレクリーニング終了させることができます。
- ラベル変更(CMS-発言は)、SWTをリードします。
- 同時クリア(CMS-同時スイープ)、ユーザスレッドを同時に実行します。
- 同時リセット状態次のトリガCMS(CMS-同時リセット)を待っていると、ユーザー・スレッドを同時に実行します。
G1コレクタ
G1(ガベージ・ファースト)は、主に複数のプロセッサと、機械の大記憶容量と同じ時間、ガベージコレクタのためのサーバである。GC休止時間の要件を満たすために、高い確率、さらに性能特性スループット高を含みます。 。完全にOracleのJDK 7更新4でサポートされて以降では、以下のアプリケーション用に設計されました:
- CMSコレクタは、共に、同時にGCスレッドの操作と応用、等、のようにすることができます。
- 空きメモリなし長いGC一時停止のコンパクトな範囲。
- 当社は、予測可能なGC休止時間を消費する必要があります。
- 私はあまりスループット性能を犠牲にしたくありません。
- 大きなJavaヒープを要求する必要が開始しない後。