>  기사  >  Java  >  프로그램 메모리에 대한 Java 코드 분석

프로그램 메모리에 대한 Java 코드 분석

Y2J
Y2J원래의
2017-05-03 15:14:281271검색

이 글에서는 주로 Java의 프로그램 메모리 분석에 대한 관련 정보를 소개합니다. 필요한 친구들이 참고하면 좋습니다.

이 글에서는 Java 프로그램을 실행할 때 JVM(Java Virtual Machine)에 대해 간략하게 설명하겠습니다. .머신) 메모리 할당.

우선 몇 가지 명사를 인지적으로 알아봅시다.

1. 일반적으로 기본 데이터 유형은 에 있습니다. 스택에는 공간이 할당되며, 로컬 변수(메소드 코드 세그먼트에 정의된 변수)도 스택에 직접 할당됩니다. 로컬 변수가 위치한 메소드가 실행되면 JVM이 해당 공간을 즉시 회수합니다. 즉, new 키워드를 사용하여 생성해야 하는 객체에 해당하는 참조 데이터 유형도 스택 공간에 있습니다. 이때 JVM은 스택의 객체 참조에 주소 공간을 할당합니다. 공간(집 번호와 동일, 이 집 번호를 통해 번호로 집을 찾을 수 있음), 참조된 객체에 대해 힙 공간에 공간을 할당하고, 스택 공간의 주소 참조는 힙 공간의 객체 영역을 가리킵니다. (집번호로 주소찾기)

2. 힙 은 일반적으로 new 키워드를 사용하여 얻은 데이터를 저장하는 데 사용됩니다.

다음에는 프로그램 실행 시 JVM의 메모리 상황을 직관적으로 느낄 수 있는 프로그램을 사용해 보겠습니다.

rree
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;
  }
}

프로그램을 실행하면 JVM이 Student 클래스와 StudentDemo를 컴파일합니다. JVM에서 메소드 영역이라는 곳으로 이동하면 클래스의 멤버 변수와 멤버 메소드도 메소드 영역에 로드됩니다.

스터디 방법을 보면 오른쪽에 16진수 표시가 있는데 이름과 나이 변수는 그렇지 않습니다. 개체마다 고유한 멤버 변수가 있지만 멤버 방법은 그렇지 않기 때문입니다. JVM은 메모리 공간을 절약하기 위해 이 표시(메모리 주소라고도 함)를 메소드에 할당하여 각각의 새 객체를 찾아 호출할 수 있습니다. 이 프로세스는 스택에 푸시한 후 실행이라고도 합니다. Student 클래스의 코드 5번째 줄에서는 이때 JVM이 메모리를 할당합니다. 힙 공간의 Student 개체에 메모리 주소를 할당합니다(객체의 멤버 변수에 값이 할당되지 않은 경우 JVM은 해당 메모리를 가리키도록 스택에 메모리 공간을 할당합니다). 이때, 메모리 모델은

코드의 8번째와 9번째 줄을 보면 OK, 프로그램이다. Student 객체의 멤버 변수에 값을 할당합니다. JVM은 학생이 가리키는 주소를 기반으로 힙 메모리에서 Student 클래스의 변수를 검색하고 해당 변수에 새로운 값을 할당합니다.

12번째 줄, 이때 학생 객체가 학습 메소드를 호출하고, JVM은 학습 메소드에 대한 스택 공간에 메모리 공간을 적용합니다

스터디 메서드가 실행된 후 스택이 즉시 해제됩니다. Space, 코드 라인 14, Student2 객체의 참조는 Student2가 가리키는 주소를 동일한 위치로 가리키므로 변수의 값은 이때 학생 객체도 변경됩니다

이 시점에서 메인 메소드의 모든 코드가 실행되었으며, 메인 메소드가 차지하는 스택 공간은 입니다. 또한 재활용되었으며, 힙 공간은 GC 재활용을 기다리고 있습니다

코드 실행 결과는 다음과 같습니다.

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());
  }
}

위 내용은 프로그램 메모리에 대한 Java 코드 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.