メモリ内のJVMは、メモリモデルとオブジェクトの初期化処理

JVMのメモリ・モデル

Java仮想マシンは、図に示されているいくつかのランタイムデータ領域に分割され、実行時データ領域と呼ばれるメモリのエリアを、管理します。
0ba9ef09351b7863b922978619e8ae6d.png

プログラムカウンタ:行番号インジケータで実行される現在のバイトコードプログラム

プログラム・カウンタ(プログラムカウンタレジスタ)は、行番号が実行現在のスレッドバイトコードの指標として見ることができる、小さなメモリ空間です。仮想マシンの概念モデルにおいて、バイトコードインタプリタ作業が通っている場合に実行されるべき次のバイトコード命令を選択するためにカウンタの値を変更する、分岐、ループ、分岐、例外処理、および他の基本的な機能のスレッド回復を私たちは、完了するために、カウンターに依存する必要があります。

ものである、マルチスレッドのJava仮想マシンスレッド割り当て実行時スイッチング及びプロセッサターン達成するための方法は、任意の時点で、プロセッサ(マルチコアプロセッサのためには、核である)だけプログラムを実行します指示。したがって、位置を切り替えた後に正常に復元するために、各スレッドは、別々のプログラムカウンタ、各スレッド・カウンタの間の相補的影響、別個の記憶装置、いわゆるなどの分野有するべきである「スレッドプライベート」メモリ

スレッドは、Javaメソッドを実行している場合、記録が実行されているカウンタは、仮想マシンのバイトコード命令のアドレス、この場合はネイティブメソッドが実行されているカウンタ値が(不定)nullですこのメモリ領域は、地域のOutOfMemoryError Java仮想マシン仕様でどのような状況のために用意されていませ唯一のものです。

Java仮想マシン・スタック:メモリモデルJavaメソッドが実行さ:スタックフレームをプッシュとポップ

プログラムカウンタと同じように、Java仮想マシン・スタック(Java仮想マシンスタックは)個人的に、そのライフサイクルと同じスレッドを所有しています。

実行仮想マシンのスタックのJavaメモリ・モデル記述された方法で行いながら各メソッドが作成:スタックフレームをローカル変数テーブルを格納するため、オペランドスタック、動的リンク、方法輸出。各メソッド呼び出しは、手続きが完了するまでは、仮想マシンでスタックからスタックにプッシュするスタックフレームに対応します。

しばしば前記ヒープ(ヒープ)とスタックメモリ(スタック)スタックメモリスタック内の仮想マシン、または仮想マシンスタックローカル変数テーブルセクションを指します。

ローカル変数テーブルデータ(ブール、バイト、文字、ショート、種々の公知のタイプのコンパイルに格納され 、整数、フロート、長い、二重)、 オブジェクト参照(参照型)とタイプRETURNADDRESS(命令バイトコードのアドレスを指し)。

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

ネイティブメソッドスタック(ネイティブメソッドスタック)と、仮想マシンのスタックが果たした役割は、その差に非常に似ているJava仮想マシンのメソッドのための仮想マシンの実行スタック(つまり、バイトコード)サービス、およびネイティブメソッドスタックがあります仮想マシンのサービスのために使用されるネイティブの方法

Javaヒープ:オブジェクトおよびストレージ・アレイ・インスタンス

ほとんどのアプリケーションでは、Javaヒープ(Javaヒープ)は中のJava仮想マシンのメモリ管理であるメモリの最大の作品Javaヒープがされたメモリ領域内のすべてのスレッドで共有して、仮想マシンの起動時に作成しましたJavaヒープの唯一の目的がされたオブジェクトのインスタンスを格納し、オブジェクトのインスタンスがメモリを割り当てるためにここにほぼすべてです。これは、Java仮想マシン仕様で説明されている:すべてのオブジェクトインスタンスと配列は、ヒープ上に割り当てられます主キーテクノロジーの脱出JITコンパイラ分析の開発が成熟すると、スタック上の分布は、スカラー交換用の最適化技術は、いくつかの微妙な変化をもたらすだろう、すべてのオブジェクトがヒープに割り当てられているが、徐々になっ少ない「絶対に」 。

Javaヒープは、ガベージコレクタによって管理されるメインエリアそれはまた、しばしばと呼ばれ、GCヒープ(ガベージヒープ収集します)

メソッド地区:クラスの情報ストレージ、仮想マシンの負荷、定数、静的変数およびコンパイルされたコード

各スレッドがされているように、地区方法(方法エリア)とJavaヒープは、共有するために使用されるメモリ領域、情報記憶を入力し、仮想マシンにロードされた定数は、静的変数は、タイムコンパイラは、コードおよび他のデータをコンパイルします

このエリアのメモリの回復は主にリサイクルのためにとタイプの定数プールをアンロードです。

実行時定数プール:方法のゾーンの一部、コンパイラは、種々の基準シンボルおよびリテラルを格納する生成

ランタイム定数プール(実行時定数プール)ゾーン法の一部です。クラス、フィールド、メソッド、およびインターフェース記述情報に加えて、クラス・ファイル・バージョンは、情報でもある(定数プールテーブルによって)定数プール記憶するため、コンパイル生成種々のリテラルの参照記号を、この部分操作の方法は、クラスローディング時定数ストレージプールの後領域に入ります。

(定数プールを含む)各パートのJava仮想マシン形式のクラスファイルは、各バイトはデータは、仮想マシンによって認識ロードされ、実行される仕様に準拠する必要があることを格納するために使用され、厳格なルールを持っていますしかし、実行時定数プールのために、Java仮想マシンの仕様は、この地域に達成するための彼らの必要性に応じて提供することができ、異なるベンダーのいずれかの詳細を必要としません。(符号の付加、直接基準時定数もまたプール操作に格納されています)

各エリアのJava仮想マシンの実行時のデータは、孤立したスレッドのスレッドの占有によってスローされる可能性があり、各Java仮想マシンの実行時のデータ領域の以下の特定の機能、共有スレッドまたはスレッドとの分離もありますが、独自の機能を持っています要約:
Snipaste_2019-08-02_13-24-50.jpg

時間に加えて、Javaの外部メモリは、ローカル直接法によって割り当てられてもよく、このメモリはまた、直接メモリと呼ばれています。ダイレクト・メモリ(ダイレクトメモリダイレクト・メモリ・ネイティブ)データ領域の一部は、仮想マシンを実行し、また明細書で定義されるJava仮想マシンのメモリ領域であるれていません。しかし、このメモリの一部ともOutOfMemeoryError例外につながる可能性があり、頻繁に使用しないでください。

JDK 1.4で新たに追加されたNIO(新しい入力/出力)タイプの導入に基づいて、チャネル(チャネル)及びバッファー(緩衝液) I / Oモードでは、ネイティブライブラリを使用することができ、割り当てられたヒープメモリの外部に直接、その後、動作させるための基準としてのJava DirectByteBufferにこのメモリをオブジェクトのスタックを格納することによって。Javaヒープのヒープとネイティブに前後にレプリケートされたデータを避けるために、これはかなりいくつかのシナリオでは、パフォーマンスを向上させることができます。

メモリプロセス内のオブジェクトを初期化します

public class Person{
    String name;
    int age;
}

mainメソッドでは、オブジェクトが作成され、以下のJVMのメモリを割り当てるプロセス
Snipaste_2019-08-02_14-04-31.jpg
クラス情報は、ハードディスクファーストクラスローダから定数、静的変数は、バイトコード(.classファイル)ファイルをロードし、仮想マシンがあっても、コンパイラ場合、ロードされコンパイルされたコードデータにゾーン法、メソッドmain(スタック・フレーム)オブジェクトを作成し、Java仮想マシン・スタックに格納されている場合、オブジェクト参照テーブルは、ローカル変数のスタックフレーム内の特定のオブジェクトの割り当てとヒープに格納されますメモリ。

おすすめ

転載: www.cnblogs.com/minghaiJ/p/11288349.html