Javaの基礎-JVMメモリ部門

画像:JVMメモリが分割されます

JVMのメモリ部門

1.プログラムカウンタ

これ格納現在アドレスを実行命令を CPU命令を実行する場合、(それが次の命令アドレスが記憶部記憶手段に記憶されていると言うことができる)、現在のプログラムカウンタから実行すべき命令のアドレスを記憶する記憶部を得ることが必要です取得したアドレス取得指示に応じて、命令を取得した後、プログラムカウンタは自動的に転送または次命令ポインタのアドレスに応じて1ずつインクリメントされる全ての命令の完了が実行されるまで、そうで得られ、。

JVMでは、マルチスレッドは、スレッドスイッチにより得られるCPUの実行時間が変わり、従って、いずれかの特定の時点で、唯一のCPUコアは、スレッドの各スレッドことを切り替えることができるように、したがって、スレッド内の命令を実行しますプログラムが実行位置を切り替える前に復元することができた後、各スレッドは、それ以外の場合は、プログラムの通常の実行順序に影響を与えるだろう、独自の独立したプログラムカウンタを必要とし、互いに干渉することはできません。したがって、いわば、各プログラムカウンタは、あるスレッドにプライベートの。

プログラムカウンタに格納されたデータが占めるスペースの大きさは、プログラムの実行と変更されませんので、プログラムカウンタにメモリオーバーフロー(のOutOfMemory)のを発生するつもりはない、原因で発生します。

2.スタック

スタックフレーム

Javaは、各スタックフレームは、現在の方法を指し、オペランドスタック(オペランドスタック)スタックフレームで、ローカル変数テーブル(ローカル変数)を含む、対応する方法と呼ばれるクラスに属しているスタック・フレームに格納されたスタックでありますランタイム定数プール(ゾーン法に一部で定数プールの概念交渉を実行時)参照(定数プールをランタイムに参照)が、この方法は、アドレス(リターンアドレス)といくつかの追加の追加情報を返します。スレッドは、対応するスタックフレームを作成するために従うことになり、スタックにスタックフレームを確立する方法を実行します。メソッドが終了すると、スタックフレームがポップアップ表示されます。

  • ローカル変数テーブルには、定義によって、我々はそれがバーの役割であることを理解すべきである何の説明があってはなりません。この方法は、(非宣言静的プロセスの変数と関数パラメータを含む)ローカル変数を格納するために使用されます。変数の基本データ型のために、それが直接参照型変数に対して、オブジェクトへの参照で格納され、値が格納されます。ローカル変数テーブルコンパイラのサイズは、そのサイズを決定することができ、そのプログラムの実行中に、ローカル変数テーブルのサイズを変更しません。

  • オペランドスタック、表現の友人を評価するために、スタックのおそらく研究のデータ構造は、不慣れな問題は、最も一般的なアプリケーション・スタックは、式を評価するために使用されてはいけません。実際には、プロセスのスレッド実行方法を考えて、プロシージャー・ステートメントを実行していきますが、最終的な分析では、計算の過程です。したがって、いわば、すべての計算手順は、オペランドスタックによって行われます。

  • 一定のクラスのメソッドの実装のプロセスであってもよいので、参照の実行時定数プールを指しは使用する必要があるので、実行時に定数を基準点が存在しなければなりません。

  • この方法は、に戻る場所にそれを呼び出す前に、終了したので、スタックフレームメソッドの戻り値のアドレスに格納されなければならないときの方法は、アドレスを返します。

各スレッドが実行されるので、この方法は異なってもよいので、各スレッドはそれ自身のJavaスタックを持ってお互いを乱すことなく、。

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

  Javaのネイティブメソッドスタックと役割のスタックと原則は非常に似ています。違いは、JavaスタックでサービスするためのメソッドのJava実装で、ローカルスタック方式は、ローカルメソッド(ネイティブメソッド:ネイティブメソッドが非コールインターフェースJavaのJavaコードである)を実装することでサービスを提供しています。   

4.ヒープ

Javaヒープは、オブジェクト自体と(もちろん、Java配列リファレンススタックに配置された)アレイを格納するために使用されます。Javaでは、プログラマがリリースされ、基本的な問題空間を気にする必要はありません、Javaのガベージコレクションが自動的に処理されます。だから、これは宇宙Javaのガベージコレクタ領域管理の主要な部分です。加えて、全てのヒープは、スレッドを共有し、JVMでのみヒープ。

メソッド領域

また、静止領域として知られている方法(メソッド領域)は、①のクラス(クラス)、②静的変数(静的変数)、③静的方法、④と⑤一定のメンバメソッドのすべてを格納します。

1.すべてのスレッドによって共有同じヒープと、静止領域として知られています。

前記記憶領域の方法は、常にプログラム全体で唯一の要素です。これは、メソッド領域は、すべてのスレッドで共有されています。

6.名前のプロセス

最後に、フローチャート、すべての領域が張ら

// AppMain.java
public class AppMain {                         //运行时,JVM把AppMain的信息都放入方法区    

    public static void main(String[] args) { //main成员方法本身放入方法区。    
        Sample test1 = new  Sample( " 测试1 " );   //test1是引用,所以放到栈区里,Sample是自定义对象应该放到堆里面    
        Sample test2 = new  Sample( " 测试2 " );         
        test1.printName();    
        test2.printName();    
    }
    
} 
复制代码

画像:操作のJVMフローチャート

JVMの実行フローチャート

要約:

  • メソッド地区:クラステンプレートを保存
  • クラスの保存例:ヒープ
  • スタック:関数の計算が実行さ

7.拡張します

  • Permanent世代

HotSpot仮想マシンの設計チームは、GC世代コレクションはメソッド領域に拡張し、または永続的な世代の面積を達成するための方法を使用して選択しました。それは、メモリ管理コード領域の方法のために特別に書かれた作業を省くことができ、同様に、そのようなホットスポットのガベージコレクタは、管理のようなJavaヒープのこの部分を管理することができます。他の仮想マシン(例えば、BEA JRockitの/ IBM J9)のためにそれが存在していない世代の永久的な概念です。

  • ランタイム定数プール

ランタイム定数プール(実行時定数プール)であるゾーン法の一部クラス追加/フィールド/メソッド/インターフェース記述情報のバージョンとクラスファイルは、情報が、運転中に発生する様々な記号とリテラルの参照をコンパイル格納するため、また、定数プール(定数プールテーブル)でありますローディング時定数ストレージプール後のアクセス領域の操作のクラスメソッドのこの部分。

String str1 = "abcd";
String str2 = new String("abcd");
System.out.println(str1==str2);//false

String str1 = "str";
String str2 = "ing";
String str3 = "str" + "ing";
String str4 = str1 + str2;
System.out.println("string" == "str" + "ing");// true
System.out.println(str3 == str4);//false

String str5 = "string";
System.out.println(str3 == str5);//true
复制代码

説明:

  • 「ABCD」は、オブジェクト、新しいStringを取るために定数プールにある(「ABCD」)は、ヒープメモリ空間に直接新しいオブジェクトを作成することです。限り新しいメソッドを使用すると、私たちは、新しいオブジェクトを作成する必要があります。
  • +「+」新しいオブジェクトを使用して、結合式をテキストのみを含むStringオブジェクトを作成するために引用符を使用する定数プールの間で作成された接続に追加されます。
  • 「+」接続文字列変数式のために、それは新しいオブジェクトが別のメモリアドレスに、実行時に作成された文字列に属している文字列プールに追加されませんので、同じ文字列から引用していない生成しますオブジェクト。

参考:

おすすめ

転載: juejin.im/post/5d9be1186fb9a04dd85918ba