Java メモリにはどのようなメモリ空間があるのか: スタック領域、ヒープ領域、メソッド領域の紹介

スタック領域:

1. 各スレッドにはスタック領域が含まれます。基本データ型のオブジェクトとカスタム オブジェクトへの参照 (オブジェクトではない) のみがスタックに格納されます。オブジェクトはヒープ領域に格納されます。

2. 各スタック内のデータ (元の型とオブジェクト参照) はプライベートであり、他のスタックからアクセスすることはできません。

3. スタックは、基本型変数領域、実行環境コンテキスト、演算命令領域(ストレージ演算命令)の 3 つの部分に分かれています。


ヒープ領域:

1. すべてのオブジェクトが保存され、各オブジェクトには対応するクラスに関する情報が含まれます。(授業の目的は操作
方法を学ぶことです)

2. JVM にはすべてのスレッドで共有されるヒープ領域 (ヒープ) が 1 つだけあり、ヒープには基本型やオブジェクト参照は格納されず、オブジェクト
自体のみが格納されます。


メソッド領域:

1. ヒープと同様に静的領域とも呼ばれ、すべてのスレッドによって共有されます。メソッド領域には、すべてのクラス変数と静的変数が含まれます。

2. メソッド領域には、クラス変数や静的変数など、プログラム全体で常に一意となる要素が含まれます。


例を挙げてみましょう。

class
Person{ int
id; String
name;
public void
print(){ System.out.println(id+","+n
ame);
}
}
public class Test {
public static void main(String[]
args){ Person p1=new Person();
p1.print();
}

次のアドレスは、上記のコードのメモリ マップです:
https://www.processon.com/view/link/5b7b7920e4b0edb75111d71e


システムは、発行された命令を受け取り、Java 仮想マシン プロセスを開始しました。このプロセスは、まず
クラスパスから Test.class ファイルを見つけ、このファイル内のバイナリ データを読み取り、次に Test クラスのクラス情報をランタイム データに格納しました。エリア。メソッド
エリア内。この処理をTestクラスのロード処理と呼びます。

次に、Java 仮想マシンはメソッド領域で Test クラスの Main() メソッドのバイトコードを見つけ、その命令の実行を開始します。この main() メソッドの最初のステートメントは次のとおりです: Person p1=new Person();
このステートメントは非常に単純で、Java 仮想マシンに Person インスタンスを作成させ、参照変数 p1 にこのインスタンスを参照させることです。
これは小さなケースのように思えます。Java 仮想マシンをトレースして、このタスクがどのように実行されるかを見てみましょう。


1. Java 仮想マシンがそれを見たところ、Test インスタンスを作成しているだけでした。簡単だったので、メソッド領域に直接移動し、
最初に Test クラスの型情報を見つけました。結果は、ふふ、見つからず、現時点ではメソッド領域に Person クラスが存在しません。しかし Java 仮想マシンも
バカではないので、「衣食足りて自分でやる」スタイルを引き継ぎ、すぐに Pesrson クラスをロードし、メソッド領域に
Person クラスの型情報を格納しました。

2. さて、情報は見つかりました。作業を始めましょう。Java 仮想マシンが最初に行うことは、ヒープ領域内の新しい Person インスタンスに
メモリを割り当てることです。この Person インスタンスは、メソッド領域内の Person クラスの型情報への参照を保持します。ここでいう参照
とは、実際にはメソッド領域にある Person クラスの型情報のメモリアドレスのことで、C
言語このアドレスが Person クラスに格納されます。インスタンスのデータ領域内。


3. JAVA 仮想マシン プロセスでは、各スレッドにはメソッド呼び出しスタックがあり、スレッドの実行中に一連の
メソッドメソッドが実行されると
、新しいフレームがメソッド スタックにプッシュされます。ここでのフレームは、メソッドのパラメータ、ローカル変数、および動作中の一時データを保存するために使用されます。

さて、原則は終わりましたので、追跡アクションを続けましょう。「=」の前にあるp1はmain()メソッド内で定義された変数であり、ローカル変数であることがわかりますので、main()メソッドを実行するメインスレッドのJAVAメソッドコールスタックに追加されます。 。また、「=」は、この test1 変数がヒープ領域内の Person インスタンスを指すようにします。つまり、この変数は Person インスタンスへの参照を保持します。


OK、ここまでで、JAVA 仮想マシンはこの単純なステートメントの実行タスクを完了しました。アクション ガイド チャートを参照して、
JAVA 仮想マシン COOL! の詳細を予備的に理解しました。次に、JAVA 仮想マシンは後続の
命令の実行を続行します。JAVA 仮想マシンが p1.print() メソッドを実行すると、JAVA 仮想マシンは
ローカル変数 p1 が保持する参照に基づいてヒープ内の Person インスタンスを見つけます。保持されている参照は、Sperson クラスの型情報を取得するメソッド内にあり、それによって print() メソッドのバイトコードを取得し、print() メソッドに含まれる命令を実行します。

おすすめ

転載: blog.csdn.net/yzwfeng/article/details/132604244