詳細なJavaのメモリアーキテクチャ

詳細なJavaのメモリアーキテクチャ

  メモリは、Javaに分けられる:スタックメモリ、ヒープ、メソッド領域、ローカルエリアおよびレジスタなどの方法を。

  以下に、スタックメモリ、各領域によってヒープメモリの特性のいくつかを説明します。

  1、スタックメモリ

  オブジェクトの基本的なタイプの(1)及び可変数は、基準変数スタックメモリの機能が割り当てられます。

  各スタックのためのデータ(2)(プリミティブ型とオブジェクト参照)がプライベートであり、他のスタックにアクセスすることはできません。

  基本的な変数の種類、及び実行環境のコンテキスト、操作指示領域(ストレージ操作指示):(3)スタックは、3つの部分に分割されています。

  変数は、コードブロックで定義されている場合(4)、Javaのメモリ空間は、変数が範囲を超えた場合、スタック内の変数のために割り当てられました

  、Javaは自動的に変数に割り当てられたメモリ空間を解放し、メモリはすぐに他の目的に使用することができます。

  (5)データはより少ないスペースを使用している場合は自動的に解除されます。

  2、ヒープメモリ

  (1)ヒープメモリが新しいによって作成されたオブジェクトと配列を格納するために使用されます。

  (2)各エンティティは、メモリアドレス値を持ちます

  (3)物理的な変数は、デフォルトの初期値を持っています

  エンティティがもはや使用されている(4)、それは無期限にガベージコレクトしないであろう

  添加:それを指す参照変数の非存在下での配列やオブジェクトは、それがごみとなり、使用できなくなりますが、メモリはまだガベージコレクタが解放される不確実性のその後の期間に、占有されています。これは、総メモリのJavaの比較は、実際には、スタック変数は、Javaでのポインタである、メモリ変数をヒープを指すように、主な理由です!

  3.メソッド領域

  1.すべてのスレッドによって共有同じヒープと、静止領域として知られています。メソッド領域は、すべてのクラスと静的変数が含まれています。

  2.メソッド領域は、常にそのようなクラス、静的変数としてプログラム全体で唯一の要素に含まれています。

  ロードされたクラスデータ記憶領域情報の方法は、

  (1)基本情報:

  各クラスの1)完全修飾名

  各クラスの2)直接スーパークラスの完全修飾名(制約のタイプを変換することができます)

  3)このクラスは、クラスまたはインタフェースであります

  4)アクセス修飾子の種類を

  直接インタフェースの完全修飾名を超える5)順序付きリスト

  詳細(2)各ロードされたクラス:

  1)実行時定数プール:

  オブジェクトおよびタイプのクラスを呼び出すために、ブリッジのタイプによって使用されるすべての定数配列内のインデックスを介してアクセスされ、(シンボルの他のタイプ、フィールド、メソッドへの直接および定数参照)、外部接点を記憶します。これは、クラスファイルは、定数プールの間に(バイトコード)を実行さを表します。(静的定数プール、バイトコードファイルがあります)。

  2)フィールド情報:

  クラス(名前、タイプ、修飾子)で宣言された各フィールドの情報。

  3)情報:

  情報は、各メソッドのクラスで宣言(名前、およびバイトコード例外テーブルタイプ、パラメータの型、修飾子、メソッドを返します)。

  4)静的変数

  5)クラスローダへの参照:参照クラスローダのクラス、すなわち、。

  6)クラスのクラスへの参照:クラスを表すために使用されてロードされる各クラスタイプの仮想マシンのインスタンスを作成すると、ロードされ

  上記スタックメモリ、ヒープ、メソッド領域、前記のいくつかのプロパティ

  スタックは、非常に重要な特殊性は、スタック内のデータを共有することができるがあるということです持っています。我々はまた、定義するとします。

  int型のA = 5;

  int型、B = 5;

  コンパイラのint A = 5と第一の取引、最初にそれが見つからない場合、それは5に記憶され、その後、点5され、スタック上の変数への参照を作成し、スタック5の値かどうかを確認します。

  治療INT B = 5続くと、bは5点であってきたが参照変数を作成した後B、それがスタックに値5を有しているように、このように5に直接Bを置きます。

  この時点で、我々は= 8を作る場合は、8値スタックがあるならば、コンパイラがない場合は、8で保存され、再度検索し、8にポイントを作る、あなたが既に持っている場合は、このアドレスを直接ポイントに。したがって、変更は、値bの値には影響を与えません。

  注:この参照は、オブジェクトなどの共有への2つのオブジェクトは、このような状況が変更Bには影響しないので、それはコンパイラによって行われ、異なっているが、それは容易にデータを共有しましたスペースを節約。そして、オブジェクト参照変数は別のオブジェクト参照変数に影響します。このオブジェクトの内部状態を変更します。

  次の例では、メモリに割り当てJavaプログラムを示しています。

  パッケージは特別なクラスのデータであることを特徴とする請求たとえば文字列、文字列を見てみましょう。あなたは使用することができます。

  文字列str =新しいString( "ABC");

  文字列str = "ABC";

  二つの形式を作成するには、最初のものである()新しいオブジェクトを作成するためには、新しいにヒープに格納されます。各呼び出しは、新しいオブジェクトを作成します。

  第二のスタックオブジェクト参照変数STR文字列クラスを作成し、スタックを探すことであるが存在しない、記憶された「ABC」、そうでない場合、次いで、スタックに格納されている「ABC」、及びSTR点「ABC」を作るためにあなたが既に持っている場合は、「ABC」はstrのポイント「ABC」の直接の原因です。

  等号()メソッドを使用して、同一であるクラス値を比較するとき、==を使用して、同じオブジェクトへの2つのラッパークラスの基準点かどうかをテストする場合、上記の理論は、実施例で説明します。

  文字列STR1 = "ABC";

  文字列STR2 = "ABC";

  System.out.println(STR1 == STR2)。//真

  //文字列1とstr2が同じオブジェクトを指して見ることができます。

  文字列STR1 =新しい文字列( "ABC");

  文字列STR2 =新しい文字列( "ABC");

  System.out.println(STR1 == STR2)。//偽

  //異なるオブジェクトを生成するための新しい方法です。一度に各1。

  だからのメモリ内の1つのオブジェクトのみが存在し、実際には、最初のアプローチで、複数の「ABC」の文字列を作成します。有利とメモリ空間を節約するの文言。JVMは、自動的にオブジェクトを作成する必要があるかどうかを決定するために、スタックデータの実際の状況に応じているので、同時にそれは、ある程度プログラムの動作速度を向上させることができます。

  文字列str =新しい文字列(「ABC」)のために、コード、平坦にかかわらず、その文字列値に等しい、ヒープ内の新しいオブジェクトを作成し、それによってプログラムの負担を増加させる、新たなオブジェクトを作成する必要があります。

  一方、注意を払う:私たちは、このような文字列STR =「ABC」としての使用、フォーマット定義されたクラスの時間、いつも当たり前のオブジェクトのstr Stringクラスのオブジェクトを作成し、作成することができるトラップの用心ないかもしれません!!。ただ、以前に作成されたオブジェクトを指します。唯一の新しい()メソッドを介して各時間が新しいオブジェクトが作成されていることを確認します。

おすすめ

転載: www.cnblogs.com/zmy-520131499/p/11128580.html