개발/Java

JVM 메모리 영역

jis1218 2024. 9. 29. 13:48
public class Main {

    public static void main(String[] args) {
        ExampleClass exampleClass = new ExampleClass();

        int sum = exampleClass.sum(5, 10);
    }
}
public class ExampleClass {

    private int a;
    private int b;

    public int sum(int a, int b) {
        return a + b;
    }
}

1단계: Main클래스 로드

  • Main 클래스가 처음 실행되면, JVM은 클래스 로더를 통해 .class 파일을 메소드 영역(Method Area)으로 로드한다. 상수 풀(Constant Pool)과 같은 기타 클래스 수준의 메타데이터 및 static 변수, 메서드들도 함께 저장된다.
  • Main 클래스의 메서드 정보(예: main 메서드에 대한 정보)와 필드 정보메소드 영역에 저장한다.
  • 여기서 메서드 테이블을 통해 메서드들이 관리됩니다. 각 메서드는 이름과 해당 바이트코드에 대한 정보가 포함된 테이블을 통해 관리되며, 이 테이블을 통해 JVM은 메서드를 호출한다.

2단계: main메서드 호출

  • main 메서드가 호출되면, JVM은 스택스택 프레임을 생성한다. 이 스택 프레임은 main 메서드의 지역 변수, 매개변수연산 스택을 위한 공간을 포함한다.
  • 메소드 영역에 있는 main 메서드의 바이트코드가 PC 레지스터를 통해 실행된다. PC 레지스터는 현재 실행할 명령어의 주소를 가리킨다. PC 레지스터는 스택 영역에 있다.(스레드마다 생긴다.)

3단계: ExampleClass 클래스 로드 및 힙 영역에 객체 저장

  • 클래스 로더가 ExampleClass를 메소드 영역에 로드하고 바이트코드 등이 저장된다.
  • ExampleClass exampleClass = new ExampleClass()에서 example 변수는 스택 영역의 메서드 프레임에 저장되며 힙 영역에 ExampleClass에 대한 객체가 저장되며 필드값인 a, b에 대한 값의 초기화가 일어난다. 그리고 example 변수는 ExampleClass의 참조값을 가지고 있다. 이 참조값을 통해 객체의 필드나 메서드에 접근한다.
  • add(5, 10)이 호출되면 스택 영역에 add 메서드의 메서드 프레임이 추가된다. 이 프레임에는 매개변수 a=5, b=10 및 지역 변수 sum이 저장된다.
  • CPU는 메서드 영역의 바이트 코드를 해석하여 add 메서드의 덧셈 연산을 수행한다. 덧셈 결과는 스택 영역의 메서드 프레임에 저장된 sum에 할당된다.

4단계: ExampleClass 클래스 로드 및 힙 영역에 객체 저장

  • add 메서드가 종료되면 add 메서드의 스택 프레임이 제거된다.
  • main 메서드가 끝나면, main 메서드의 스택 프레임도 제거된다.
  • 모든 스택 프레임이 제거되면 스레드도 종료된다.

참고사항

https://www.youtube.com/watch?v=GU254H0N93Y

https://www.youtube.com/watch?v=QPulWilGBpk

https://d2.naver.com/helloworld/1230