簡単な紹介
Java仮想マシンの起動には、Java仮想マシン仕様の論理領域内のすべてのスレッドで共有されているメモリのJava仮想マシン管理の最大の作品である場合、Javaヒープが作成され、唯一の要件は、それがその論理的にあり、連続していますであってもよく、それは(理解するオペレーティングシステムメモリ管理の知識と組み合わせることができる)物理的連続性を必要としません。Javaヒープ唯一の役割は、インスタンスおよびストレージアレイをobjectにあります。
メモリの回復の観点、及び世代コレクションアルゴリズムを使用して、仮想マシンの今ほとんどから、そのため、Javaヒープも古いに分けることができ、新たな世代の、より詳細なに分けることができサバイバースペースからとサバイバーに、エデンスペーススペース。
メモリ割り当ての観点から、スレッドが共有Javaヒープはまた、複数のスレッドがプライベートバッファ(TLAB)を割り当てる分割してもよいです。
Javaのヒープオブジェクト
- オブジェクトの作成
- 新しいコマンドを参照するには、仮想機会は、最初にすることができ、新しいディレクティブの引数に言及する場合、定数プール対応するシンボルクラス参照に見つけて、クラスを表すために、このクラス参照のシンボルが、ロードされ解析され、初期化されているかどうかを確認しますただし、対応する実行する必要がない場合は、クラスのロード処理を 2を実行している場合、。
- クラスがロードされた決定した後、仮想マシンは、適切なターゲット・メモリ空間に割り当てられますクラスがロードされた後、このメモリ空間の大きさが完全に確立することができます。
- メモリ空間を割り当てる方法を「分けることができるポインタ衝突」と「フリーリストの有無にかかわらず、ガベージコレクタによって採用決定により2種類、」方法「圧縮機能を仕上げ」。
- マルチスレッディング新しいオブジェクトの下に作成されたセキュリティスレッドを確保するためには、2つのオプションを提供します:
- 最初は、メモリ空間に割り当てられた同期(仮想マシンの動作であるCASの故障の再試行保証アトミック更新操作と結合方法)
- 他のスレッドに応じて分割された異なる空間で行われるメモリ割り当て動作です。以前に小さなJavaのメモリを割り当てられた各パイル糸は、ローカルスレッド割り当てバッファ(TLAB)と呼ばれます。+/- UseTLAB引数:TLABを採用するかどうか、-XXを使用しています。
- メモリ割り当ての後、仮想メモリ空間はゼロ値に初期割り当てされます。
- 次に、さまざまな方法の現在の運転状態に基づいて仮想マシンを選択し、に従ってことができるオブジェクトヘッダ、このオブジェクトが検索する方法、クラスのインスタンスである、例えば、オブジェクトに必要な設定を行うようなメタデータ情報オブジェクトのハッシュコードを、GCは、世代、年齢オブジェクト。
- オブジェクトのメモリレイアウト
- オブジェクトヘッダ:オブジェクトヘッド及び情報は、2つの部分に分割することができます
- ストレージオブジェクト自体ランタイムデータ(マーク・ワード):ハッシュコード、GC世代、年齢、ロックステータスフラグ、スレッドがロックを保持しているが、スレッドID、タイムスタンプのバイアスを逃しました
- 型ポインタ:そのクラスのメタデータであるオブジェクトへのポインタは、仮想マシンは、オブジェクト・クラスのインスタンスであるポインタによって決定されます。
- オブジェクトが配列である場合、オブジェクトヘッダはまた、配列の長さのデータレコードを格納します。
- データの例:実際のオブジェクトは、有効なデータだけでなく、フィールドの内容定義プログラム・コード・セグメントの様々な種類に格納されています。それは親クラスやデータのサブクラスであるかどうかを記録する必要があります。格納順序のこの部分は、Javaコード定義された順序で、仮想マシン割り当てストラテジパラメータとフィールドをもたらすであろう。
- アライメントパディング:HotSpot VMの自動メモリ管理システムは、オブジェクトの開始アドレスを必要とする8バイトの整数倍でなければならない、すなわち、オブジェクトのメモリサイズが8の倍数でなければなりません。
- オブジェクトヘッダ:オブジェクトヘッド及び情報は、2つの部分に分割することができます
- オブジェクト指向へのアクセス:Javaで、私たちのプログラムは、ヒープオブジェクトのインスタンスに保存されているが、実際には、我々は、仮想マシンのスタック内の参照、参照することにより、これらのオブジェクトを操作したいです。具体的には、2つの主要なアクセス方法があります。
- ハンドルを使用する:データのタイプ(メモリ内にこのハンドルに対応するリファレンスセル、及び記憶されたハンドラ・オブジェクト・インスタンスのデータ(ヒープ)に格納された値、つまり、プール・ハンドルを記憶するためのハンドラ・アドレス領域をドロップ特定のアドレス情報のそれぞれの方法の領域)。
- 直接ポインタ:オブジェクト(ヒープ)に直接参照アドレス、およびオブジェクトインスタンスのデータ内のデータの種類(面積法)へのポインタを含んでいます。(このように使用されるホットスポット)
Javaヒープとガベージコレクタ
スレッドプライベート仮想マシン・スタック、ネイティブメソッドスタックとプログラムカウンタによって占められるメモリの場合、彼らは糸の端部と自動的に回収されるが、それはメインのJavaヒープ管理オブジェクトのガベージコレクタであるため、しばしばと呼ばれますGCヒープ。メモリ管理の観点からは、Javaヒープは古いに細分化することができ、新しい世代の更なるサバイバーとToサバイバーから、エデンに分け。
- オブジェクトは、アルゴリズムを生き延びたかどうかを確認します。
- 参照カウントアルゴリズム
- アルゴリズムのアイデア:それを参照する場所があるたびに、それはカウンタを追加すると、オブジェクトのカウンタへの参照を追加し、フェイルカウンタを参照するときに1ずつデクリメントされます。カウンタが0である任意の時間は、もはや参照できません。
- 長所:シンプル、高効率が決定されます
- 短所:主流のJava仮想マシンがカウンターアルゴリズムの選択の主な理由ではありませんが、循環参照の問題を解決することは困難であるということです。
- 到達可能性計数アルゴリズム:オブジェクトのJavaかどうかを決定する、他の実行可能な方法で使用されるC#言語。
- アルゴリズムのアイデア:「と呼ばれるシリーズGCルーツ起点としてオブジェクト」は、これらのノードから下に検索を開始するために、オブジェクトを参照し、GCルートの任意の鎖に接続されていない参照のチェーンによって、これを横切っ呼ばれる検索パスオブジェクトが利用できないオブジェクトであり、オブジェクトが回収可能と判断できます。
- GCのルーツオブジェクト:
- VMのスタック参照オブジェクト
- 領域によって参照されるメソッド静的プロパティクラスオブジェクト
- メソッド地区一定の基準オブジェクト
- ネイティブメソッドスタックJNIのオブジェクト参照
- 引用:
- 強い参照
- 定義:オブジェクトOBJ =新しいオブジェクト();
- 特徴:強い参照する限り、まだ、ガベージコレクタが参照されたオブジェクトを再利用することはありません
- ソフト参照
- 定義:使用SoftReferenceクラスソフト参照にソフト参照を達成するためには、ほとんどの場合、メモリに敏感なキャッシュを実装するために使用されています。
- 特徴:システムがメモリオーバーフロー例外の前に起こるために起こっている、ソフト参照は、二次回復の回復の範囲に含まれます。
- 弱参照
- 定義:ソフト参照よりも弱い、弱い参照達成するためには、弱参照は、ほとんどの場合、マッピングの標準化を達成するために使用されています。あなたはisEnQueuedメソッドは、オブジェクトが今後のリサイクルごみのためのガベージコレクタをマークされているか否かを監視オブジェクトを返します弱い参照を使用することができます。
- 特長:次のガベージコレクションが発生するまで、オブジェクトが弱参照に関連付けられている、唯一の生き残ることができます。
- 偽の引用
- 定義:また、引用したゴーストやファントム参照として知られ、参照関係が最も弱いです。PhantomReference達成します。主にオブジェクトがメモリから削除されたかどうかを検出するために使用されます。
- 特徴:仮想基準が存在するときに、オブジェクト、ファントム参照オブジェクトのインスタンスによって達成することができない、彼らの生存時間に影響を及ぼさないであろう。
- 強い参照
- 参照カウントアルゴリズム
- ガベージコレクションのアルゴリズム:
- マーク - スイープアルゴリズム:
- レプリケーションアルゴリズム:現在の商用仮想マシンが、このメソッドを使用して新しい世代を回復。
- 主なアイデア:メモリ内の体積は、各々がメモリを使い果たしたとき、また、相互にライブオブジェクトがコピーされた値を使用しており、これを空にした後に使用されている、二つの等しいサイズに分割されていますメモリ。次いで、オブジェクトが作成されるので、98%はすぐに期限切れ、したがってさらに大きな面積エデン、サバイバー及び2つのより小さなエリアにメモリの2つの等しい割合、メモリを必要とせず、それぞれがエデン使用しますサバイバー。別のオブジェクトサバイバーサバイバーへのブロックの場合は生存とエデンの回復コピー、およびサバイバーエデンに空にした後。(デフォルトのホットスポットが利用可能であるエデン:サバイバー= 8:1)。
- マーク-照合アルゴリズム:オブジェクト内のコピーアルゴリズムは効率がより高い割合で減少します生き延び、その者のリサイクル古いアルゴリズムでは、マークを使用しています-ソートアルゴリズムを。
- 世代別コレクションアルゴリズム:仮想マシンのガベージコレクタの現在のビジネスは「世代コレクション」です
- メモリの生存期間は、いくつかの作品、通常は新世代へのJavaヒープと古い時代に分けて誰に応じて、あなたはすべての年齢の特性に応じて、適切な収集方法を選択することができます。
- 概要:仮想マシンは、現在の世代のコレクションアルゴリズムガベージコレクションのために。新世代と古い時代に上のJava。新世代では、各ガベージコレクションオブジェクトは、死者の数が多いとき、ほんの数が生き残るので、ガベージコレクションのアルゴリズムをコピーすることを選択し、古い時代には、理由はオブジェクトの高い生存率を、保証をしなければならない割り当てられる余分なスペースがありませんリサイクルのために-あるいは「仕上げ記号」 - 「クリーンアップマーク」を使用。
- ガベージコレクタ(ケーブルミックスを表すと)ホットスポット
- シリアルコレクター:コレクターはシングルスレッド、それがガベージコレクトされたときに、アウトすべてのスレッドを中断しなければならないです。
- 短所:自動的に仮想マシンによって開始され、すべての作業は、ユーザーが表示されていない場合には停止
- 長所:シンプルで効率的な、クライアント・モードでの仮想マシンを実行するために適しました。
- ParNewコレクター:のシリアルマルチスレッド版。それがCMSで使用されるシリアル・コレクターに加えて、協力する唯一の方法であるため、多くの仮想マシンは、コレクターの新世代のための選択のサーバーモードで実行されています。
- 並列スカベンジコレクタは:マルチスレッドコレクタの新しい世代であるが、その焦点は、適応的に調整することができる、特定のを達成するように制御されます。
- シリアル旧コレクター:シリアル年の古いバージョンを収集。
- Parrallel旧コレクター:パラレル清掃をするの古いバージョン。敏感なアプリケーションでそのスループットとCPUリソースを注意し、パラレル清掃をプラスパラレル旧の組み合わせと考えることができます
- CMSコレクタ:これらの応答時間のアプリケーションに特に重点を置いて、サーバー側のインターネットサイトやB / Sシステムに焦点を当てたアプリケーションに理想的な最短目標復旧時間コレクタの一時停止、。「マーク - スイープ」に基づくアルゴリズムは、4つのステップに分けることができます。
- 初期マーク
- 並行マーク
- ラベルを変更
- 同時クリア
- G1コレクター:ガベージコレクタは、サーバーアプリケーション用に設計されています。ホットスポットは、それが完全に将来的にCMSを置き換えることができることを願っています。パラレルと同時、世代収集、空間の統合、予測可能な一時停止:それは次のような特徴があります。
- 、JavaヒープメモリレイアウトG1コレクタを使用する場合、依然として新世代と老年の概念があるが、それはJavaヒープメモリの全体にわたって複数の等しいサイズ(地域)の別々の領域に分割され、広範に変化はなく、両方をそして、彼らは地方のコレクションの一部を物理的に分離されています。
- シリアルコレクター:コレクターはシングルスレッド、それがガベージコレクトされたときに、アウトすべてのスレッドを中断しなければならないです。
- メモリの割り当てと回復
関与上記知見に重要な補完
定数プール:
Javaの参照:
- ソフト参照SoftReference:(弱い参照とPhantomReference用法同様に、あなたは詳細なAPIを見てみることができます)
- そのようなものの例は、単純なキャッシングを指示するために使用されてもよい;クラスまたは派生サブクラスは、より複雑なキャッシュを実現するために、より大きなデータ構造のために使用することができます。限りソフト参照は、そのオブジェクトが実際に使用され、オブジェクトが到達可能なオブジェクトが強くあることを示しているとして、それはソフト参照はクリアされません。たとえば、ガーベッジコレクタは、残りの項目を放棄するかどうかを決定することにより、最近使用されるオブジェクトアイテムの強力な指標を維持することによって、洗練されたキャッシュは、最近使用されたアイテムを放棄防ぎます。
-
ソリューションリファ= 新しいソリューション(); SoftReference <ソリューション> S = 新しい SoftReference <ソリューション> (参照先)。 リファ = nullを。 s.get();
- 優秀な関連するブログ
サバイバー空間と空間からサバイバーへエデンスペース、: