ホームページ  >  記事  >  Java  >  プログラムメモリに関するJavaコードの分析

プログラムメモリに関するJavaコードの分析

Y2J
Y2Jオリジナル
2017-05-03 15:14:281203ブラウズ

この記事では、Java のプログラム メモリの解析に関する関連情報を主に紹介します。必要な方は参考にしてください。

この記事では、Java プログラムを実行するときの JVM (Java 仮想マシン) のメモリ割り当てについて簡単に説明します。

まず、いくつかの名詞を知覚的に理解しましょう:

1. スタック 一般に、基本的なデータ型はスタック上に直接スペースを割り当て、ローカル変数 (メソッド コード セグメントで定義された変数) も同様に割り当てます。ローカル変数が配置されているメソッドが実行されると、そのスペースはすぐに JVM によって再利用されます。これは、通常、作成する必要があるオブジェクトと呼ばれるものに対応します。このとき、JVM はスタック空間内のオブジェクト参照にアドレス空間 (家を見つけるための番地に相当) を割り当て、割り当てます。オブジェクトはヒープ空間内の参照への参照を割り当て、スタック空間内のアドレス参照はヒープ空間内のオブジェクト領域を指します (ハウス番号を通じてアドレスを見つけます)。

は通常、キーワード new を使用して取得されたデータを保存するために使用されます。

次に、プログラムを使用して、プログラムの実行中に JVM のメモリ状況を直感的に感じてみます

package demo;
public class Student {
  private String name;
  private int age;

  public void study() {
    System.out.println("I love study!");
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }
}
package demo;

public class StudentDemo {
  public static void main(String[] args) {
    Student student = new Student();

    System.out.println(student.getName() + ":" + student.getAge());
    student.setName("John");
    student.setAge(23);
    System.out.println(student.getName() + ":" + student.getAge());
    
    student.study();
    
    Student student2 = student;
    student2.setName("Jack");
    student2.setAge(25);
    System.out.println(student2.getName() + ":" + student2.getAge());
    System.out.println(student.getName() + ":" + student.getAge());
  }
}

プログラムを実行すると、JVM は Student クラスと StudentDemo クラスをコンパイルし、それらをここで、クラスのメンバー変数とメンバーメソッドもメソッド領域にロードされます。このとき、メモリモデルは次のようになります

に16進数のマークがあることがわかります。これは、各オブジェクトが独自のメンバー変数を持っているためですが、メモリ領域を節約するために、クラス内のメンバー メソッドを各オブジェクトで共有できるためです。 JVM はこのタグ (メモリ アドレスとも呼ばれます) をメソッドに割り当てて、新しいオブジェクト検索呼び出しができるようにします。その後、JVM は自動的にメイン メソッドを検索し、メイン メソッド用のスタック内のスペースを適用します。このプロセスはスタックへのプッシュとも呼ばれ、次に Student クラスのコードの 5 行目を実行します。このとき、JVM はヒープ領域にメモリを割り当て、Student オブジェクトにメモリ アドレスを割り当てます。オブジェクトのメンバー変数に値が割り当てられていない場合、JVM はその変数に初期値を割り当てます。この時点で、ヒープ領域の Student オブジェクト領域を指すようにメモリ領域の一部が割り当てられます。 、メモリ モデルは次のとおりです

次に、コードの 8 行目と 9 行目を見てください。プログラムは Student オブジェクトのメンバー変数に値を割り当てます。JVM は、Student クラスの変数を検索します。学生が指定したアドレスに基づいてヒープメモリを取得し、変数に新しい値を代入します

12行目、この時点で学生オブジェクトは学習メソッドを呼び出し、JVMはスタック内のメモリ空間を適用します。学習メソッドのスペース

学習メソッドの実行後、すぐにスタック領域を解放します。 コードの 14 行目で、student2 オブジェクトの参照は、student が指すアドレスを指しています

15 行目。コードの16は、student2の変数に値を代入します。student2とstudentは同じ場所を指しているので、この時点で、studentオブジェクトの変数の値も変更されています

、メインメソッド内のすべてのコードが実行され、メインメソッドによって占有されていたスタックスペースもリサイクルされ、ヒープスペースはGCリサイクルを待っています

コードの実行結果は次のとおりです:

null:0
John:23
I love study!
Jack:25
Jack:25

以上がプログラムメモリに関するJavaコードの分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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