JIT 컴파일과 계층형 컴파일
JVM이 자주 실행되는 메서드를 해석한 다음 JIT 컴파일하는 방식과 컴파일을 실행하고 관찰하는 방법을 학습합니다.
JIT 컴파일과 계층형 컴파일은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Java Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
인터프리터와 적시 컴파일
JVM은 처음에 바이트코드를 인터프리터로 실행합니다. 메서드가 자주 호출되어 핫 상태가 되면 적시 컴파일러가 네이티브 기계어 코드로 컴파일하므로 실행 속도가 훨씬 빨라집니다.
계층형 컴파일(Java 8부터 기본값)
계층형 컴파일은 5개 계층을 사용합니다: T0(인터프리터), T1(C1 단순 컴파일), T2(C1 제한적 프로파일링), T3(C1 전체 프로파일링), T4(C2 완전 최적화)입니다. 메서드는 더 자주 실행될수록 상위 계층으로 이동합니다.
// Enable/disable tiered compilation:
// -XX:+TieredCompilation (default ON in Java 8+)
// -XX:-TieredCompilation (disables — only C2 used)C1 컴파일러(클라이언트 컴파일러)
C1은 적당한 최적화를 적용하면서 빠르게 컴파일합니다. C2가 사용할 수 있도록 호출 빈도와 분기 결과를 측정하는 프로파일링 계측을 추가합니다.
C2 컴파일러(서버 컴파일러)
C2(옵토)는 인라이닝, 이스케이프 분석, 루프 전개, 벡터화, 죽은 코드 제거와 같은 심층 최적화를 수행합니다. 가장 빠른 네이티브 코드를 생성하지만 컴파일에 더 오래 걸립니다.
// Force server JIT only:
java -server MyApp
// Or explicitly:
java -XX:-TieredCompilation MyApp // uses C2 only (warm-up is slower)핫스폿 임계값
메서드는 호출 카운터가 임계값을 넘으면 적시 컴파일됩니다. 기본값은 10,000회 호출(C2)입니다. -XX:CompileThreshold=N으로 조정할 수 있습니다.
// Lower threshold for faster warm-up (at cost of less optimization):
java -XX:CompileThreshold=1000 MyApp인라이닝
인라이닝은 C2에서 가장 영향력이 큰 최적화입니다. 핫 코드에서 호출되는 작은 메서드를 호출 지점에 복사해 넣어 메서드 디스패치 비용을 없애고 추가 최적화를 가능하게 합니다.
// Check inlining decisions:
java -XX:+PrintInlining -XX:+UnlockDiagnosticVMOptions MyApp
// Output:
// @ 5 com.example.User::getName (5 bytes) inlined이스케이프 분석
C2가 객체가 현재 메서드(또는 스레드)를 벗어나지 않는다고 판단하면 힙 대신 스택에 할당할 수 있습니다. 이를 통해 가비지 컬렉션 부담을 완전히 없앨 수 있습니다.
// Objects that don't escape are stack-allocated:
String result = new StringBuilder().append("Hello ").append(name).toString();
// The StringBuilder may be eliminated by escape analysis적시 컴파일 로그
-XX:+PrintCompilation을 사용하면 각 메서드가 컴파일될 때마다 기록됩니다. 출력에는 메서드 이름, 계층, 컴파일 플래그가 표시됩니다.
// java -XX:+PrintCompilation MyApp
// Output:
// 1 n java.lang.String::hashCode (0 bytes)
// 25 3 com.example.UserService::findById (42 bytes)
// 31 4 com.example.UserService::findById (42 bytes) made not entrant역최적화
적시 컴파일의 가정이 위반되면(예: 호출 지점의 수신 객체 타입을 변경하는 클래스가 로드되는 경우) C2는 역최적화를 수행하여 인터프리터 또는 C1으로 되돌아갑니다. 이는 정상적인 동작이며 대개 사용자에게 드러나지 않습니다.
워밍업 시간
적시 컴파일에는 시간이 걸립니다. 실행 시간이 짧은 프로세스에서는 메서드가 적시 컴파일되지 않을 수도 있습니다. 더 빠른 시작을 위해 사전 컴파일(GraalVM 네이티브 이미지)을 사용하거나 클래스 데이터 공유(CDS)로 적시 컴파일 결과를 캐시하십시오.
// Enable AppCDS to cache JIT-compilable classes:
java -XX:ArchiveClassesAtExit=app.jsa -cp app.jar MyApp # generate archive
java -XX:SharedArchiveFile=app.jsa -cp app.jar MyApp # use archiveGraalVM 적시 컴파일
GraalVM은 C2를 Java로 작성된 적시 컴파일러로 대체합니다. 이를 통해 더 나은 최적화, Java가 아닌 언어에 적시 컴파일을 사용할 수 있는 기능, 그리고 네이티브 이미지(사전 컴파일)의 기반을 제공합니다.
빠른 확인
호출자에 작은 메서드를 병합하여 메서드 호출 비용을 없애는 적시 컴파일 기법은 무엇입니까?
요약
계층형 컴파일은 메서드를 C1(빠른 컴파일 및 프로파일링)에서 C2(심층 최적화)로 이동시킵니다. 주요 최적화에는 인라이닝, 이스케이프 분석, 루프 전개가 있습니다. -XX:+PrintCompilation을 사용해 적시 컴파일 결정을 관찰하십시오. 성능을 측정하기 전에 워밍업하십시오.
자주 묻는 질문
“JIT 컴파일과 계층형 컴파일” 강의는 무료인가요?
네 — “JIT 컴파일과 계층형 컴파일” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“JIT 컴파일과 계층형 컴파일”에서 뭘 배우나요?
JVM이 자주 실행되는 메서드를 해석한 다음 JIT 컴파일하는 방식과 컴파일을 실행하고 관찰하는 방법을 학습합니다. 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Java Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“JIT 컴파일과 계층형 컴파일” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.