Java でのメモリ割り当ては、Java プログラムまたはサービスにストレージを割り当てるプロセスとして定義できます。 Java におけるメモリ割り当ては、JVM (Java Virtual Machine) メモリ内で行われ、ヒープ メモリと非ヒープ メモリに大別されます。この記事では、ヒープ メモリと非ヒープ メモリに相当するスタック メモリが Java プログラムにどのように割り当てられるかについて詳しく説明します。
広告 このカテゴリーの人気コース JAVA マスタリー - スペシャライゼーション | 78 コース シリーズ | 15 回の模擬テストご存知のとおり、Java はオブジェクト指向言語です。したがって、Java で作成されたすべてのオブジェクトは JVM (Java 仮想マシン) に保存されます。 JVM メモリは次の部分に分割されます:
Java ランタイムは、Java プログラムの実行中にヒープ メモリを使用してオブジェクトとクラスにメモリを割り当てます。 Java でオブジェクトが作成されると、そのオブジェクトはヒープ メモリに格納されます。さらに、ガベージ コレクション プロセスがヒープ メモリ上で実行され、不要な領域が解放されます。ガベージ コレクションは、参照を持たないオブジェクトをヒープ領域から削除します。 Java のヒープ メモリは次の部分に分割されます:
Java ヒープ メモリに関する重要な点をいくつか示します:
名前が示すように、スタック メモリは LIFO (後入れ先出し) 原理に基づいています。スタック メモリは静的メモリの割り当てに使用され、Java プログラムの実行スレッドごとにスタック メモリがあります。 Java メソッドが呼び出されるたびに、ローカル変数または中間変数とメソッド内の他のオブジェクトへの参照を保持する新しいブロックが Java スタック メモリ内に作成されます。メソッドの実行が完了するとすぐに、スタック内のメモリ ブロックは空になり、次のメソッドによって使用されます。したがって、スタック メモリ サイズはヒープ メモリよりも小さくなります。ここでは、スタック メモリの重要な機能をいくつか紹介します。
これは Java のスタック メモリとヒープ メモリの小さな比較です:
Heap Memory | Stack Memory |
The entire application uses heap memory during its runtime. | The application in parts uses stack memory. That means it is used one at a time during thread execution. |
Heap memory is larger than stack memory. | Stack memory is small as compared to heap memory. |
All objects created during the application are stored in heap memory. | Stack memory only stores local variables and references to objects. |
Access to heap memory is slow. | Access to stack memory is fast as compared to heap memory. |
Heap memory is allocated by creating new objects and gets deallocated by a garbage collector. | Stack memory is automatically allocated and deallocated with the end in method execution. |
Heap memory stays as long as the application is running. | Stack memory stays only until a method is executing. |
次に、メモリがどのように割り当てられるかを示す Java の例を見てみましょう
コード:
package com.edubca.javademo; class StudentData{ int rollNumber; String name; public StudentData(int rollNumber, String name) { super(); this.rollNumber = rollNumber; this.name = name; } public int getRollNumber() { return rollNumber; } public void setRollNumber(int rollNumber) { this.rollNumber = rollNumber; } public String getName() { return name; } public void setName(String name) { this.name = name; } } public class Main { public static void main(String[] args) { int id = 11; String name = "Yash"; StudentData s = null; s = new StudentData(id, name); System.out.println("Student Id is " + s.getRollNumber()); System.out.println("Student Name is " + s.getName()); } }
出力:
次に、上記のプログラムでメモリがどのように割り当てられるかを見ていきます。
1. Main クラスでは、main メソッドに入った後、id、名前はローカル変数なので、次の方法でスタック メモリにスペースが作成されます。
2. StudentData クラス コンストラクターへの呼び出しがスタック メモリの先頭に追加されます。その結果、以下が保存されます:
3. StudentData クラスで宣言された 2 つのインスタンス変数はヒープ メモリに格納されます。
以上がJava でのメモリ割り当ての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。