記事のディレクトリ
Java仮想マシン(JVM)
オブジェクト指向のJava-メモリ分析のために、我々は最初に何をJava仮想マシン(Java仮想マシン、JVM)のことを知っている必要がありますか?JVMは、Java仮想マシンのバイトコードを実行することができます。プログラミング言語の仮想マシンとして、実際には、長い任意の言語で、コンパイル済みのファイル形式をロードするためにJVMの要件に合致コンパイラで生成されたファイルは、JVMでコンパイルを実行することができますようとして、Java言語に捧げられていないだけ。そして、Java仮想マシンを使用することによって、あなたは、クロスプラットフォームの問題を解決することができます。
JVMの基本的な構造
JVMは、三つの主要なサブシステムで構成されてい
- クラスローダサブシステム
- ランタイムデータ領域(メモリ構造)
- 実行エンジン
クラスローディング機構
クラスのライフサイクル
1.負荷:の.classファイルがディスクからメモリに読み込まれます
2.接続
2.1検証:バイトコードファイルの正当性の検証(和)
2.2の調製:メモリを割り当てるクラスに静的変数、およびデフォルト値を与え
2.3分析:他のすべてのクラス(静的にリンクされた)クラスローダがロード参照されるクラス
3.初期化:静的変数の準備フェーズの正しい初期値のように与えられた静的変数は、ここで指定した仮想マシンのデフォルトの初期値に割り当てられていることは、変数の初期配分の実際の値についてのプログラマです静的コードブロックを実行します
4.:プログラムの実行
5.アンインストール:エンドプログラム
タイプのクラスローダ
- スタートクラスローダ(ブートストラップクラスローダ)
などJREゴール下rt.jarの、charsets.jarなどとして、JREのコア・クラス・ライブラリをロードする責任 - 拡張クラスローダ(拡張クラスローダ)
クラスのパッケージにJRE拡張ディレクトリのext jarファイルをロードするための責任 - システムクラスローダ(アプリケーションクラスローダは)
パッケージパスクラスパスにクラスをロードするための責任があります - カスタムローダー(ユーザクラスローダ)は
、ユーザー定義クラスのパッケージパスをロードする責任があります
クラスローディング機構
-
全体的な責任の委譲メカニズム
クラスをロードするときにクラスローダは、別のショーのクラスローダがない限り、そのクラスが依存しており、参照先のクラスもクラスローダによってロードされます -
両親デリゲートメカニズムを
見つけると、ターゲットクラスをロードするために、自分の道を見つけることができませんダウンロードする場合には、ターゲットクラスを見つけるために、親クラスローダを委任する指し -
長所両親デリゲートモード
1.サンドボックスセキュリティメカニズム:防止は、コアライブラリの改ざん例えば、自分のString.classクラスを記述するためにはロードされませんが、される
2無料の読み込みクラスを繰り返した:とき、親クラスローダ、すでにロードされたクラスの時間、あなたはないの必要性を行います子クラスローダは再びロード
ランタイムデータ領域(メモリ分析)
1.メソッド領域(方法エリア)(以前は永久生成/永久世代と呼ばjdk1.8、以下素子空間と呼ばれます)
(1)JVMは、すべてのスレッドで共有一方向のみの領域であります
(2)方法スタック領域は、クラス情報関連した定数を格納するための実際のです
(3)方法は、プログラムの内容を格納するために使用することは常に一定であるかのみ、すべてのフィールドと、クラスバイトコードの方法、およびそのようなコンストラクタのようないくつかの特別な方法は、インターフェースコードはまた、本明細書に定義されます。手短に言えば、すべての定義されたプロセス情報が領域に格納されて、静的変数+定数+クラス情報(コンストラクタ/インタフェース定義)+実行時定数プール(文字列カテゴリ)ゾーン法に存在します。
2.スタック(スタック)
メモリ・モデルJavaスレッドの方法を実行するために、スタックに対応するスレッド、各方法は、スタックフレーム(一方実行作成するローカル変数テーブルを格納するため、オペランドスタック、動的リンク、方法輸出情報)ガベージコレクションの問題は存在しない、スタックの保存特性が「最後のアウト、最後では、最初のアウト」続く長いスレッドスタックの端が解放されると、同じスレッドのライフサイクルを。そして、スタックは、システムによって自動的に割り当てられ、高速では、スタックは、連続したメモリ空間です。
3.ヒープ(ヒープ)
(1)スタックは、(作成されたオブジェクトと配列を格納するために使用される配列はオブジェクトです)
(2)JVMは、すべてのスレッドで共有されている、唯一のヒープであります
(3)スタックが遅い連続したメモリ空間、柔軟な割り当てではありません。
(4)スタックは、メインガベージコレクタ領域管理、ガベージコレクションであるが、詳細は下記を参照します。
4. Aネイティブメソッドスタック(ネイティブメソッドスタック)
そして、スタック効果は非常に似ていますが、違いは、Javaサービス・メソッドのJVM実装のJavaスタックであり、一方、ローカル(ネイティブ)メソッドサービスのJVM実装のためのネイティブメソッドスタック。ローカル登録方法、実行エンジンを実行するときに、ローカルライブラリをロードするための方法。
プログラム・カウンタ(プログラムカウンタレジスタ)
メソッドのバイトコード領域のメソッドへのポインタである(次の命令のアドレスを格納するために使用される点、命令コードが実行されようとしても)、次の命令は、実行エンジンによって読み取られますそれはほとんど無視できる、非常に小さなメモリ空間であります
ガーベジコレクション
そのC ++プログラマは、ほとんどの頭痛のメモリ管理の問題、すぐにJavaのヒープガベージコレクションメカニズムの導入、で。だから、Javaプログラマが大幅に開発の効率を向上させ、ビジネスロジックではなく、メモリ管理の仕事に多くのエネルギーを置くことができます。
プログラマは、自分を書くことができますSystem.gc()
が、これはガベージコレクタへの呼び出しではありません、ただプログラムが起動するかどうかを、GCを推奨またはガベージコレクションメカニズムによって制御を開始します。
新世代(若い世代)
クラスはガベージコレクタ、人生の終わりを収集した後、アプリケーションを発生する領域、の誕生、成長と終焉のように。
新生代は二つの部分に分かれています。エデン地区(エデンスペース)と生存者ゾーン(サバイバースペース)、すべてのクラスは、新しいエデンエリアに出ています。存続面積はFromおよびTo領域に分かれています。スペースのエデン領域が使い果たされる場合は、オブジェクトのエデン面積はもはや他のオブジェクトに適用されるプログラムやオブジェクト、JVMのガベージコレクタのガベージコレクション(マイナーGC)エデン地区を作成する必要が破壊されました。その後、領域にサバイバーオブジェクトからイーデン残りの領域。サバイバーからの面積は、ガベージコレクションのエリアそして、また一杯になったし、その後にサバイバー領域に移動した場合。
歳(旧世代)
複数回オブジェクトの新しい世代後(15回デフォルト)老齢エリアにGCまだ生きて移動。古い年が一杯になった場合は、(また、全GC呼び出すことができます)主なGCは、今回が起こるのメモリ用の古い領域をクリーンアップします。高齢者のフルGCを実行した後、エリアはまだオブジェクトを保存することはできませんが見つかった場合、OOM(OutOfMemoryErrorの)例外がスローされます。
エレメントスペース(メタスペース)
JDK1.8後、メタスペースは永久的、恒久的な置換を代表して、仮想マシンではなく、メタデータエリアでなく、ローカルメモリを除き、JVM仕様領域メソッドの実装である、仮想マシンを永久世代を置き換えますまた、ではなく、物理的に、スタックの論理構造に属しています。
なぜ永久世代を削除?:リファレンス公式の説明