Java仮想マシンのメモリモデル

  JVMは、略語JavaVirtualMachine(Java仮想マシン)で、JVMは、様々なコンピュータ実現される機能の実際のコンピュータシミュレーション上を通過する架空のコンピュータであるAコンピューティングデバイスのための仕様です。Java言語の非常に重要な特徴は、プラットフォームに依存しています。Java仮想マシンの使用は、この特性を達成するための鍵です。少なくともニーズが異なるオブジェクトコードにコンパイルすることで、一般的な高レベルの言語は、あなたは、異なるプラットフォーム上で実行したい場合。そして、Java仮想マシン語の導入後、Java言語は、ときに、異なるプラットフォーム上で実行するために再コンパイルする必要はありません。唯一のJava言語コンパイラは、オブジェクトコード(バイトコード)を生成するように、特定のシールドのプラットフォームに関連付けられているJava言語情報を使用してJava仮想マシンで実行中のJava仮想マシンは、複数のプラットフォーム上で変更することなく実行することができます。Java仮想マシンのバイトコードは、実行されると、特定のプラットフォーム上で実行されたマシン命令にバイトコードインタプリタ。これは「一度コンパイルどこでも実行」の理由にJavaの機能です。

  ヒープ:

  仮想マシンが起動を作成するとき、ヒープ、メモリ空間のストアオブジェクトに使用され、ほぼすべてのオブジェクトのスレッドによって共有領域であるヒープ上に配置されています。

  仕様では、このような記述:

  すべてのオブジェクトインスタンスと配列ヒープに割り当てられるが、JITコンパイラ技術の成熟し、エスケープ解析の開発と、スタック用の配布/スカラー

  他の最適化手法は、微妙な問題が発生したいくつかにつながるでは、すべてのオブジェクトが徐々に少なくなり、カテゴリヒープに割り当てられています。

  スタックはまた、新しい世代、古い時代に細分化することができるように、Javaヒープガベージコレクションのメカニズムは、主な場所である、新生代のセグメントに分割され、その後、エデンスペース/サバイバー空間から/へのサバイバースペース。

  Java仮想マシン仕様は、Javaヒープが、論理的に連続したメモリ空間であってもよく、物理的に接続されていない、のいずれかで拡張可能とすることができる所定の大きさを達成するために、現在主流の仮想マシンは、空間に拡張可能従います達成(および-Xmx -Xmsによって制御されます)。そこにはメモリがヒープメモリ割り当て完了インスタンスではなく、ヒープを拡張することができない場合は、メモリ不足の例外がスローされます。

  仮想マシンのスタック:

  Javaのメモリモデルは、仮想マシン・スタックの実行方法は、深さにStackOverflowErrorが例外をスローします許可された仮想マシンのスタックより大きくなし、プライベートスレッドの深さを説明しています。あなたが十分なメモリを適用することができない場合は、仮想マシンのスタックがアプリケーションの時に、動的に拡張可能である場合には、拡張メモリになり、OutOfMemoryErrorが報告されます。

  スタックフレーム:

  仮想マシンのデータ構造、メソッド呼び出しと実行の方法をサポートします。彼は、仮想マシンがスタックのデータ領域に仮想マシンを実行しているスタック要素です。スタックフレームは、ローカル変数テーブル、オペランドスタック、動的リンク、メソッドの戻りアドレスやその他の情報を保持しています。

  終了操作開始からの各メソッドの呼び出しがプッシュされているメソッドとプロセススタックと呼ばれています。

  そのデータがどのくらいのメモリが割り当てられる変数のスタックフレームのニーズを実行しているが、唯一の特定の仮想マシンに依存することはありません影響を与えたときにどのようにローカル変数テーブルの多くとどのように深いオペランドスタック、決定するコンパイル時にコード、スタックフレーム実装。

  ローカル変数テーブル:メソッドのパラメータおよび貯蔵の方法で定義されたローカル変数を格納するためのスペース、すべての基本データ型は、コンパイル時に格納されていてもよい、参照型とリターンアドレス(バイトコード命令のアドレスポインティング)を理解しました。メモリ32は、3つ以上の連続した領域のスロットが割り当てられることになるである場合には、テーブル32、スロットと呼ばれる変数の最小単位です。

  オペランドスタック:スタックはまた、人工的として知られ、それが最後では、最初のうちスタックです。バイトコードの基礎となるJVMがスタックベースの命令セット型である、すべてのオペコード、オペランドスタック上のデータであり、各メソッド呼び出しのために、計算に使用する、JVMオペランドスタックが作成されて動作します。オペランドスタックサイズは、コンパイル時に知られています。オペランドスタックの操作は、任意のJavaデータ型です。

  この方法は、ちょうど開始したときに、そのオペランドスタックが空で、バイトコード命令の実装を行う方法、オペランドスタックに書き込まれたローカル変数テーブルまたはオブジェクトインスタンスからコピーされた定数または変数フィールド再計算要素は、ローカル変数にスタックをポップやテーブルが、発信者法、即ち、プル/プッシュ動作に戻される。と 一つの完全な時にしばしばプッシュ/プッシュ処理を行うような方法の複数を含みます。

  動的リンク:シンボル解決相が直接参照にクラスローディング位相基準になりますが、静的な解像度と呼ばれ、他の部分はすべてのランに変換される動的リンクとして知られている直接参照の期間ああ、です。各スタックフレームは、メソッドがスタックフレームにダイナミックリンク呼処理方法をサポートする実行時定数プールへの参照を含んでいる属します。

  メソッド地区:鄭州婦人科診察価格http://www.zzkdfk.com/

  、仮想マシンのロードクラス情報、コンパイルされたコード、クラスメタデータの主記憶領域の方法など。方法の前に実施1.8 JDKが領域A永久発生領域、JVMのメモリを使用して、領域のこの部分と呼ばれ、JVMのメモリ素子を使用されない空間を除いて、スペースを達成するために使用される永久jdk8生成要素を除去した後しかし、システムメモリの使用。

  永久世代文字列定数プールの除去がヒープに配置された後、収集ガベージコレクタに便利であり得る、実行時定数プールは、実行時定数プール静的変数を置き、次元空間に配置され、バイトコード彼は、メソッドエリアと呼ばれる場所やその他の重要な情報は、我々はそれを置くことができます。

  ネイティブメソッドスタック:

  仮想マシンに似たネイティブメソッドスタックおよびスタックは、オブジェクトの違いは、仮想マシンとメソッドのJava JVMサービスが実行され、サービスがネイティブメソッドによって実行されるネイティブメソッドスタックはJVMです。敗者ネイティブ方法としては、簡単な説明は、非JavaのJavaメソッド呼び出しです。

  プログラムカウンタ:

  これはメモリ領域オーバーフロー異常を必要としないJava仮想マシン仕様は、現在実行中のスレッドの行番号がネイティブメソッドを実行するとき、プログラムカウンタの値がヌルである、実行されたマークである、小さなメモリ空間です。次の命令を決定するために、カウンタの値を変更することによって動作する仮想マシンで実行されます。我々は、JVM実装はCPUラウンドロビンアルゴリズムが実装されている(すなわち、交互スレッド及び割り当て処理の実行時間を切り替える)ことにより、マルチスレッド化されている知っています。言い換えれば、スレッドが別のスレッドのタイムスライスを始めるためにしながら、実装プロセスに懸濁されたタイムスライスを使い果たす可能性があるため。プログラム・カウンタを通してスレッドを記録するために、それが最後のJVMで実行された場所を知ることが必要であるところから継続するために中断されたときに中断されたスレッドは、タイムスライスを再取得する場合バイトコード実行位置。したがって、プログラム・カウンタは、各スレッドが独自の独立したワークカウンタを有する単離されたスレッドを有する特性です。

おすすめ

転載: www.cnblogs.com/gnz49/p/12059489.html