- C/C++ 은 컴파일 플랫폼과 타겟 플랫폼이 다르다면 프로그램이 동작하지 않는다.
- 이와 다르게 자바는 JVM을 통해 타겟 플랫폼과 상관없이 컴파일된 소스코드(Java Bytecode)가 동작하도록 설계했다.
- WORA(Write Once, Run Anywhere)
Java 소스코드의 변환 과정
- Java Compiler(
javac
)를 통해 소스코드를 분석 : Source Code(.java
) -> Java Bytecode(.class
)
- JVM 실행 : Java Bytecode(
.class
) -> Target Assembly Program
- bytecode는 JVM이 알아들을 수 있는 명령어 집합이고 JVM은 bytecode를 기계어로 번역해 CPU에게 일을 시킴
JVM 구조
Class loader
Runtime Data Area
- JVM이 Java bytecode를 실행하기 위해 사용하는 메모리 공간
Method Area
- 모든 스레드 공유
- 클래스 로더가 클래스 파일을 읽어오면 클래스 정보(필드, 메서드, 정적 정보)를 파싱해서 저장
heap
- 모든 스레드 공유
- 런타임 환경에서 생성되는 모든 객체를 저장
- 여기서 GC가 동작
Java stacks
- Per Thread
- 메서드를 실행하기 위한 정보 저장
pc registers
- Per Thread
- pc = program counter
- 현재 실행되고 있는 명령어의 주소를 저장
native method stacks
- 성능 향상을 목적으로 Java Bytecode가 아닌 다른 언어로 작성된 메서드를 저장
JVM 동작
- 컴파일러가 Java 소스코드(
.java
)를 컴파일해서 클래스 파일(.class
)파일을 생성
- 클래스 파일을 실행하면 JVM이
Class Loader
를 통해 클래스 파일을 읽어들임
- 클래스 파일에 들어있는 정보가 클래스 로더에 의해 Method Area 에 올라감
- JVM이 Runtime Data Area를 구성
- Execution Engine이 bytecode를 읽고 실행
- Garbage Collection 자동 실행되 메모리를 효율적으로 관리
REF
무민의 JVM Stack & Heap
어썸오의 JVM Memory Layout