Java スタックとヒープ:Java メモリ割り当てのチュートリアル
スタック メモリとは
Java のスタックは、メソッド、ローカル変数、および参照変数を含むメモリのセクションです。スタック メモリは、常に後入れ先出しの順序で参照されます。ローカル変数はスタックに作成されます。
ヒープメモリとは
ヒープは、オブジェクトを含むメモリのセクションであり、参照変数も含む場合があります。インスタンス変数はヒープに作成されます
Java でのメモリ割り当て
Java でのメモリ割り当て 構造体とクラスの変数とインスタンスを格納するために、仮想メモリ セクションがプログラム内に確保されるプロセスです。ただし、宣言時にオブジェクトにメモリが割り当てられず、参照が作成されるだけです。オブジェクトのメモリ割り当てには new() メソッドを使用するため、オブジェクトには常にヒープ上にメモリが割り当てられます。
Java メモリ割り当ては、次のセクションに分かれています:
<オール>このメモリの分割は、その効果的な管理に必要です。
- コード セクションには バイトコード が含まれます .
- スタック メモリのセクションには、メソッド、ローカル変数、参照変数が含まれています。
- ヒープ セクションには オブジェクト が含まれています (参照変数を含む場合もあります)。
- 静的 セクションには 静的データ/メソッド が含まれています .
ローカル変数とインスタンス変数の違い
インスタンス変数 クラス内で宣言されていますが、メソッド内では宣言されていません
class Student{ int num; // num is instance variable public void showData{}
ローカル変数 内部で宣言されています を含むメソッド メソッド 引数 .
public void sum(int a){ int x = int a + 3; // a , x are local variables; }
スタックとヒープの違い
ビデオにアクセスできない場合は、ここをクリックしてください
これをよりよく理解するために、例を挙げてみましょう。
メソッド m1 を呼び出すメイン メソッドを検討してください
public void m1{ int x=20 }
スタック Java では、メソッド m1 からフレームが作成されます。
m1 の変数 X は、スタック内の m1 のフレームにも作成されます。 (下の画像を参照してください)。
メソッド m1 がメソッド m2 を呼び出しています。スタック Java では、フレーム m1 の上に m2 の新しいフレームが作成されます。
変数 b と c もスタック内のフレーム m2 に作成されます。
public void m2(int b){ boolean c; }
同じメソッド m2 がメソッド m3 を呼び出しています。再びフレーム m3 がスタックの一番上に作成されます (下の画像を参照)。
ここで、メソッド m3 が、変数 int p と int q の 2 つのインスタンスを持つクラス「Account」のオブジェクトを作成しているとします。
Account { Int p; Int q; }
メソッド m3 のコードは次のとおりです
public void m3(){ Account ref = new Account(); // more code }
ステートメント new Account() はアカウントのオブジェクトをヒープに作成します。
参照変数「ref」は、スタック java に作成されます。
代入「=」演算子は、ヒープ内のオブジェクトを指す参照変数を作成します。
メソッドの実行が完了したら。制御の流れは、呼び出し元のメソッドに戻ります。この場合はメソッド m2 です。
メソッド m3 からのスタックはフラッシュされます。
参照変数はヒープ内のオブジェクトを指しなくなるため、ガベージ コレクションの対象になります。
メソッド m2 の実行が完了すると。スタックからポップアウトされ、そのすべての変数がフラッシュされ、使用できなくなります。
メソッド m1 についても同様です。
最終的に、制御の流れはプログラムの開始点に戻ります。通常、これが「メイン」メソッドです。
オブジェクトがインスタンス変数として参照を持っている場合
public static void main(String args[]) { A parent = new A(); //more code } class A{ B child = new B(); int e; //more code } class B{ int c; int d; //more code }
この場合、参照変数「子」がヒープに作成され、次の図のようにそのオブジェクトを指します。
まとめ:
- メソッドが呼び出されると、スタックの一番上にフレームが作成されます。
- メソッドの実行が完了すると、制御の流れが呼び出し元のメソッドに戻り、対応するスタック フレームがフラッシュされます。
- ローカル変数はスタックに作成されます
- インスタンス変数はヒープ内に作成され、それらが属するオブジェクトの一部です。
- 参照変数はスタックに作成されます。
Java