Theory
JAVA/Kotlin
JVM

JVM

JVM은 Java Virtual Machine의 약자로 자바 가상 머신이라고 불리며, 자바 바이트 코드를 가상 컴퓨터이다.

JVM의 실행 순서

개발자가 작성한 java 소스 파일을 컴파일함(이 과정에서 byte code(.class파일)로 변환) 👉 class loader가 class 파일을 메모리에 로딩함 👉 Execution Engine(JIT Compiler)이 class 파일을 해석함 👉 해석된 class 파일을 Runtime Data Area에 배치함 👉 Garbage Collector가 더 이상 사용하지 않는 메모리를 해제함

JVM 각 영역의 역할

  • Java Source : 개발자가 작성한 자바 소스 파일
  • Java Compiler : Java Source를 Byte Code(.class 파일)로 변환
  • Java Byte Code : Java Compiler에 의해 수행될 결과물 (확장자는 .class 파일)
  • Class Loader : JVM 내로 .class 파일들을 Load하여 Loading된 클래스들을 Runtime Data Area에 배치
  • Execution Engine : Loading된 클래스 파일들을 해석(Interpret)하고 실행함
  • Runtime Data Area : 프로그램을 수행하기 위해 OS로부터 별도로 할당받은 메모리 공간

Runtime Data Area의 구성

  • Method Area : 클래스, 변수, Method, static 변수, 상수 정보 등이 저장되는 영역이다. (모든 Thread가 공유)
  • Heap Area : new 명령어로 생성된 인스턴스와 객체가 저장되는 구역이다. (Garbage Collector가 참조되지 않는 메모리를 해제)
  • Stack Area : 지역변수, 매개변수, 리턴 값, 연산 중 발생하는 임시 값 등이 저장되는 영역이다. (Thread마다 별도로 존재)
  • PC Register : CPU의 Register와 역할이 비슷하다. 현재 수행 중이 JVM 명령의 주소값이 저장된다. (Thread마다 별도로 존재)
  • Native Method Stack : 다른 언어(C/C++ 등)의 메소드 호출을 위해 할당되는 구역으로 언어에 맞게 Stack이 형성되는 구역이다. (Thread마다 별도로 존재)

Hotspot JVM

Hotspot JVM은 Longview Technologies LLC라는 회사에서 1999년 처음 발표된 JVM이다. 이후 이 회사는 같은 해 SUN에 인수되어 1.3 버전부터 SUN의 기본적인 JVM이 되었다.

Eden 영역은 Object가 Heap에 최초로 할당되는 장소이며 Eden 영역이 꽉 차게 되면 Object의 참조 여부를 따져 만약 참조가 되어 있는 Live Object이면 Survivor 영역으로 이동하고 참조가 끊어진 Garbage Object이면 그냥 남겨 놓는다. 모든 Live Object가 Survivor 영역으로 넘어가면 Eden 영역을 모두 청소(Scavenge)한다. 이러한 전반의 과정을 Minor GC라고 한다.