ホームページ  >  記事  >  Java  >  Java のメモリの種類

Java のメモリの種類

王林
王林オリジナル
2024-08-30 15:17:29272ブラウズ

Java 仮想マシンのメモリ領域は、Java アプリケーションの実行時に含まれるさまざまなプログラムの実行に使用される実行時領域です。JVM のメモリ領域は、メソッド領域、ヒープ領域、スタック、プログラム カウンタ (PC) レジスタ領域、およびネイティブ メソッド領域。この記事では、Java のさまざまな種類のメモリについて説明します。

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

Java の上位 5 種類のメモリ

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

1.メソッドエリア

すべての実行スレッドは、JVM メモリ領域のこの部分を共有します。定数プール、クラス フィールド、コンストラクター コード、メソッド コードなどのクラス要素。メソッド領域はヒープ領域の一部と考えることができますが、クラスごとのデータのみを保存します。メソッド領域はクラスレベルの情報を保持する責任があると言えます。

2.ヒープメモリ

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

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

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

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

3.スタックメモリ

名前が示すように、スタック メモリは LIFO (後入れ先出し) 原理に基づいています。スタック メモリは静的メモリの割り当てに使用され、Java プログラムの実行スレッドごとに独自のスタック メモリがあります。 Java メソッドが呼び出されるたびに、ローカル変数または中間変数とメソッド内の他のオブジェクトへの参照を保持する新しいブロックが Java スタック メモリ内に作成されます。メソッドの実行が完了するとすぐに、スタック内のメモリ ブロックが空になり、次のメソッドで使用されます。スタック メモリのサイズは、ヒープ メモリに比べて小さくなります。ここでは、スタック メモリの重要な機能をいくつか紹介します。

  • 新しいメソッドがスタック メモリに追加されたり削除されたりすると、スタック メモリはそれぞれ拡大および縮小します。
  • スタック メモリは、メソッドの実行完了後に自動的に割り当てられ、割り当て解除されます。
  • スタック メモリへのアクセスは、ヒープ メモリと比較して高速です。
  • スタック メモリがいっぱいになると、Java によってスタック オーバーフロー例外と呼ばれる例外がスローされます。
  • 各スレッドには独自のスタック メモリがあるため、スタック メモリはスレッドセーフです。

4. PC レジスタ

pc レジスタの主な機能は、現在命令を実行しているアドレスを保存することです。また、現在の命令の実行を担当するスレッドのアドレスも保存されます。 PC レジスタに割り当てられるメモリのサイズは非常に小さいです。 JVM で実行される Java アプリケーションは、PC レジスタ メモリやその内容に影響を与えません。

5.ネイティブエリア

この領域は Java 以外の言語を使用して実装されています。新しいスレッドを作成すると、作成されたスレッドごとにこの領域にメモリが割り当てられます。ネイティブ領域のサイズは固定または動的にすることができます。

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 のメモリの種類

メモリ割り当て:

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

  • Main クラスでは、main メソッドに入った後、ID、名前がローカル変数であるため、スタック メモリ内のスペースが次の方法で作成されます。
    • プリミティブ値を持つ整数 ID はスタック メモリに格納されます。
    • StudentData オブジェクト s の参照は、ヒープ メモリに格納されている元の StudentData オブジェクトを指すスタック メモリに格納されます。
  • StudentData クラス コンストラクターへの呼び出しは、さらにスタック メモリの先頭に追加されます。以下が保存されます。
    • 呼び出し元オブジェクトへの参照
    • 値 11 を持つ整数変数 ID。
    • ヒープメモリ内の文字列プールに格納されている実際のオブジェクトを指す文字列型変数名の参照。
  • StudentData クラスで宣言された、studentId とstudentName という名前の 2 つのインスタンス変数がヒープ メモリに格納されます。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。