What is JVM?
- 자바 가상 머신(Java Virtual Machine, JVM)은 시스템 메모리를 관리하면서 자바 기반 어플리케이션을 위해 이식 가능한 실행 환경을 제공한다.
- 자바 프로그램이 어느 기기, 또는 어느 운영체제 상에서도 실행될 수 있게 하는 것과 프로그램 메모리를 관리하고 최적화해준다.
- 자바 바이트 코드(
.class
)를 실행할 수 있는 주체로 JVM 덕분에 CPU나 운영체제가 독립적으로 동작 가능하다.
JVM의 구조
- 실행될
.class
파일을 메모리에 로드 후 초기화 작업 수행한다.
- 메소드와 클래스 변수들을 해당 메모리 영역에 배치한다.
- 클래스 로드가 끝난 후 JVM은
main()
메소드를 찾아 지역변수, 객체변수, 참조변수를 스택에 쌓는다.

Class Loader
- 자바 컴파일러가
.java
파일을 컴파일하면 .class
파일(자바 바이트 코드)이 생성된다.
- 이렇게 생성된
.class
파일들을 엮어 Runtime Data Area 형태로 메모리에 적재하는 역할을 한다.
- 클래스 로딩을 위한 JVM의 로딩 절차
- 어떤 메소드를 호출하는 문장을 만났는데, 그 메소드를 가진 바이트 코드가 아직 로딩된 적이 없다면, 곧바로 JVM은 JRE 라이브러리 폴더에서 클래스를 찾는다.
- 없으면 CLASSPATH 환경 변수에 지정된 폴더에서 클래스를 찾는다.
- 찾았으면 그 클래스 파일이 올바른지 바이트 코드 검증
- 올바른 바이트 코드라면 메소드 영역으로 파일을 로딩
- 클래스 변수를 만들라는 명령어가 있으면 메소드 영역에 그 변수를 준비한다.
- 클래스 블록이 있으면 순서대로 그 블록을 실행한다.
- 이렇게 한번 클래스의 바이트 코드가 로딩되면 JVM이 종료될때까지 유지된다.
Execution Engine
- Class Loader를 통해 JVM 내의 런타임 데이터 영역에 배치된 바이트 코드(
.class
)를 실행한다.
- 이때, 자바 바이트 코드를 명령어 단위로 읽어서 실행한다.
Garbage Collector
- 힙 메모리 영역에 존재하는 객체들 중에 생존 여부를 판단하여 더 이상 사용되지 않는 객체를 제거하는 방식으로 메모리를 자동 관리한다.
Runtime Data Area