공부/Java

[JAVA] Java의 컴파일 과정 및 메모리 구조

맴썰 2022. 2. 19. 21:24

우리가 작성한 Java 코드, 즉 .java file은 java 컴파일러인 javac에 의해서 확장자가 .class인 바이트 코드로 변환된다.

 

이 바이트코드를 JVM 내의 Class Loader가 읽어들이고 메모리에 배치하는데, 클래스를 읽어와(Loading) 레퍼런스에 연결(Linking)하고, Static 변수 초기화 및 변수 할당(Initialization)의 과정을 거친다.

 

Class Loader에 의해 배치된 바이트 코드는 Execution Engine에 의해 실행되고, 실행 엔진은 이를 줄 단위로 읽어서 수행한다.

 

Garbage Collecter는 객체의 사용여부를 판단하고 사용되지 않는 객체를 자동적으로 해제시키는 역할을 수행한다.

 

Runtime Data Areas는 총 6개의 영역으로 구분된다.

 

  • Method(static) Area : 가상 머신이 읽은 클래스와 인터페이스 상수에 대한 Runtime Constant Pool과 메소드 및 필드, 그리고 Static 변수와 메소드 바이트 코드 등을 저장하는 영역
  • Runtime Constant Pool : Method Area 내부에 있지만 클래스와 인터페이스 상수, 메소드 및 필드에 대한 모든 레퍼런스를 저장하는 영역으로 구분된다. 가상머신은 이 곳에서 해당하는 메소드 및 필드의 실제 주솟값을 찾는다.
  • Heap Area : new 명령어로 생성된 객체나 인스턴스, 배열 등이 저장되는 공간, 즉 동적으로 할당된 값들이 저장된다.
  • Stack Area : FILO 구조로 이루어져 있으며, Heap Area에 저장된 객체들의 레퍼런스 값이나 원시타입의 지역변수의 실제값이 할당된다.
  • PC register : 가상 머신의 명령어 주소값을 가지고 있는 저장장치
  • Native Method Stack Area : Java 이외의 언어로 작성된 코드를 실행할 때 할당되는 영역