오늘은 자바 코드의 실행과정과 메모리 구조에 대해서 알아보겠습니다.
자바 코드가 실행되기까지
우리가 작성한 자바 소스 코드는 javac (Java Compiler)를 통해 바이트 코드(.class)로 변환된 뒤, 최종적으로 기계어로 변환되어 CPU가 이를 처리하는 과정을 거친다.
이때 바이트 코드를 기계어로 변환하는 방법에는 2가지가 있다.
1. JVM의 JIT (Just-In-Time)와 관련된 환경변수 설정(default Y)을 파악하여, SPARC(Scalable Processor Architecture) 혹은 Intel의 기계어(machine code)를 통해 실행되는 방법
2. 환경변수 설정이 없을 시, interpreter를 통한 실시간 번역으로 기계어로 바뀌는 방법
이러한 과정을 거쳐 번역된 기계어는 각 플랫폼의 JVM 통해(Windows, Linux, Mac) 실행될 수 있다.
JIT 컴파일러
그렇다면 JIT와 Interpreter를 통한 기계어로의 번역에는 어떤 차이가 있을까?
Interpreter의 경우 코드를 한 줄씩 번역하여 실행되므로, 코드의 양이 늘어날 수록 실행 시간이 증가하고 이는 성능 감소로 이어진다.
이러한 문제를 해결하기 위해 JIT 컴파일러가 등장하였다.
JIT 컴파일러는 한 마디로 빠른 컴파일 및 특정 환경에 맞춤화된 최적화를 제공하여 성능을 향상시킨다.
그럼 JIT 컴파일러가 사용된 JVM, HotSpot JVM에 대해 알아보면서 JIT 컴파일러에 대해 자세히 알아보자.
HotSpot VM
JDK 1.3 부터 JVM의 구현체 중 하나인 HotSpot VM이 기본 JVM으로 JIT 컴파일러 C1, C2가 포함되어 있다.
두 컴파일러의 특징을 비교하면 다음과 같다.
(두 컴파일러는 모두 바이트 코드를 기계어로 번역하기 위한 컴파일러임을 잊지 말자)
JIT 컴파일러 | C1 (클라이언트 컴파일러) | C2(서버 컴파일러) |
컴파일 속도 | 빠름 | c1보다 느림 |
코드 최적화 정도 | 기본적인 최적화만 수행 | 높은 최적화 (warm-up 후 성능 극대화) |
적합 어플리케이션 | 즉시 실행되는 클라이언트 어플리케이션 | 장기 실행되는 서버 어플리케이션 |
그렇다면 c1, c2는 어떻게 동작할까?
C1과 C2의 동작
JVM은 처음에 실행된 코드에 대해서는 interpreter를 활용하여 데이터를 수집한다. 자주 실행되는 코드가 식별되면, C1 컴파일러가 이를 native code(기계어)로 컴파일(빠른 컴파일과 간단한 최적화)한다. 이를 통해 이후 실행되는 interpreter를 거치지 않고 직접 실행된다. 더 많은 데이터가 수집될 경우 높은 최적화를 통해 C2 컴파일러가 중요 코드들을 다시 컴파일하며 실행 성능을 향상시킨다.
(프로그램 실행 중에 컴파일하여 런타임 최적화를 수행)
최적화 기법의 종류
Loop Unrolling, Inlining, Escape Analysis, Branch Prediction, Memory Layout Optimization, Devirtualization
이렇듯 컴파일러를 순차적으로 적용하는 방식을 계층형 컴파일(Tiered Compliation)이라고 한다.
코드 캐시
native code로 컴파일된 코드는 캐시 코드라고하는 특수 힙에 저장된다. 이 캐시는 반복되는 메서드 호출 시 컴파일된 코드를 재사용함으로써 코드의 실행 속도를 향상시킨다. 또한 JVM은 코드 캐시의 크기를 관리하며, 메모리 관리를 수행하기도 한다.
JIT 컴파일러의 한계
1. 복잡한 코드 ( C++ 사용)로 인한 최적화와 유지보수 지속성의 어려움
👉 GraalVM의 등장
2. 초기 실행 시 (warm-up 전) 성능 저하
3. 코드 캐시 메모리 과부하 가능성
4. 런타임 최적화로 인한 성능 변동 가능성
GraalVM은 이후 포스팅에서 자세히 다루겠습니다.
출처
본 게시글은 망나니개발자 선생님의 포스팅을 참조하였습니다.
https://mangkyu.tistory.com/301
[Java] Hotspot VM의 한계(JIT, Just-In-Time 컴파일러)와 이를 극복하기 위한 GraalVM의 등장
이번에는 Hotspot VM의 한계와 이를 극복하기 위한 GraalVM에 대해 알아보도록 하겠습니다. 1. Hotspot VM과 JIT 컴파일러(Just-In-Time Compiler) [ C 언어의 동작 방식 ] C, C++, GoLang, Rust 등과 같은 컴파일 언어는
mangkyu.tistory.com
https://docs.oracle.com/cd/E19455-01/806-3461/ch1intro-3/index.html
Sun Just-In-Time (JIT) Compiler (JDK 1.1 for Solaris Developer's Guide)
Sun Just-In-Time (JIT) Compiler The Sun Java JIT compiler, an integral part of the Solaris JVM, can accelerate execution performance many times over previous levels. Long-running, compute-intensive programs show the best performance improvement. JIT Compil
docs.oracle.com
'Java' 카테고리의 다른 글
객체지향의 사실과 오해를 읽고 (1) | 2025.02.12 |
---|---|
VO(Value Object)는 무엇이고 왜 쓰는 걸까? (1) | 2025.01.23 |
자바의 런타임 데이터 영역에 대하여 (2) | 2024.06.15 |
추상클래스와 인터페이스에 대하여 (0) | 2024.06.12 |
JAVA를 잡아보자 (프로그래밍 언어, 자바) (2) | 2024.01.21 |