Java でのメモリ割り当て

王林
リリース: 2024-08-30 15:17:34
オリジナル
570 人が閲覧しました

Java でのメモリ割り当ては、Java プログラムまたはサービスにストレージを割り当てるプロセスとして定義できます。 Java におけるメモリ割り当ては、JVM (Java Virtual Machine) メモリ内で行われ、ヒープ メモリと非ヒープ メモリに大別されます。この記事では、ヒープ メモリと非ヒープ メモリに相当するスタック メモリが Java プログラムにどのように割り当てられるかについて詳しく説明します。

広告 このカテゴリーの人気コース JAVA マスタリー - スペシャライゼーション | 78 コース シリーズ | 15 回の模擬テスト

Java でのメモリ割り当てはどのように機能しますか?

ご存知のとおり、Java はオブジェクト指向言語です。したがって、Java で作成されたすべてのオブジェクトは JVM (Java 仮想マシン) に保存されます。 JVM メモリは次の部分に分割されます:

Java でのメモリ割り当て

1.ヒープメモリ

Java ランタイムは、Java プログラムの実行中にヒープ メモリを使用してオブジェクトとクラスにメモリを割り当てます。 Java でオブジェクトが作成されると、そのオブジェクトはヒープ メモリに格納されます。さらに、ガベージ コレクション プロセスがヒープ メモリ上で実行され、不要な領域が解放されます。ガベージ コレクションは、参照を持たないオブジェクトをヒープ領域から削除します。 Java のヒープ メモリは次の部分に分割されます:

  • 若い世代: これは、新しく作成されたすべてのオブジェクトが配置される部分です。 Java ヒープのこの部分がいっぱいになると、スペースを解放するために小規模なガベージ コレクションが発生します。
  • 古い世代: マイナー ガベージ コレクション後にメモリに残ったすべてのオブジェクトは古い世代に移動されます。したがって、これは、寿命の長いオブジェクトが存在するヒープ メモリの部分です。
  • 永続生成: JVM のこの部分には、Java アプリケーションを実行するためのメタデータを提供するネイティブ メソッドと静的メソッドが含まれています。

Java ヒープ メモリに関する重要な点をいくつか示します:

  • ヒープ領域がいっぱいになると、Java によって OutOfMemory エラーがスローされます。
  • ヒープ メモリへのアクセスはスタック メモリに比べて遅いです。
  • ヒープ メモリはスタック メモリに比べてサイズがはるかに大きくなります。
  • ヒープ メモリはすべてのオブジェクトで共有されるため、スレッドセーフではありません。
  • スペースを解放するためにガベージ コレクターが必要なため、ヒープ メモリには自動割り当て解除は存在しません。

2.スタックメモリ

名前が示すように、スタック メモリは LIFO (後入れ先出し) 原理に基づいています。スタック メモリは静的メモリの割り当てに使用され、Java プログラムの実行スレッドごとにスタック メモリがあります。 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.
ヒープ メモリ スタック メモリ アプリケーション全体は実行時にヒープ メモリを使用します。 アプリケーションは部分的にスタック メモリを使用します。つまり、スレッドの実行中に一度に 1 つずつ使用されます。 ヒープ メモリはスタック メモリよりも大きいです。 スタック メモリはヒープ メモリに比べて小さいです。 アプリケーション中に作成されたすべてのオブジェクトはヒープ メモリに保存されます。 スタック メモリには、ローカル変数とオブジェクトへの参照のみが保存されます。 ヒープ メモリへのアクセスが遅いです。 スタック メモリへのアクセスは、ヒープ メモリに比べて高速です。 ヒープ メモリは、新しいオブジェクトを作成することによって割り当てられ、ガベージ コレクタによって割り当てが解除されます。 スタック メモリは、メソッド実行の終了とともに自動的に割り当てられ、割り当て解除されます。 ヒープ メモリは、アプリケーションが実行されている限り残ります。 スタック メモリはメソッドが実行されるまでのみ保持されます。 テーブル>

Java でのメモリ割り当ての例

次に、メモリがどのように割り当てられるかを示す 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());
}
}
ログイン後にコピー

出力:

Java でのメモリ割り当て

次に、上記のプログラムでメモリがどのように割り当てられるかを見ていきます。

1. Main クラスでは、main メソッドに入った後、id、名前はローカル変数なので、次の方法でスタック メモリにスペースが作成されます。

  • プリミティブ値を持つ整数 ID はスタック メモリに格納されます。
  • StudentData オブジェクト s の参照は、ヒープ メモリに格納されている元の Student オブジェクトを指すスタック メモリに格納されます。

2. StudentData クラス コンストラクターへの呼び出しがスタック メモリの先頭に追加されます。その結果、以下が保存されます:

  • 呼び出し元オブジェクトへの参照
  • 値 11 を持つ整数変数 ID。
  • 文字列型変数名の参照は、ヒープメモリ上の文字列プールに格納されているオブジェクトを指します。

3. StudentData クラスで宣言された 2 つのインスタンス変数はヒープ メモリに格納されます。

以上がJava でのメモリ割り当ての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート