인터프리터의 느린 방식의 대처방안: JIT(Just In Time) 컴파일러
JIT(Just In Time) 컴파일러
프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법이다.(JIT 컴파일 = 인터프리터 방식 + 컴파일 방식)
- 컴파일 방식: 소스코드를 한번에 컴퓨터가 읽을 수 있는 native machine(기계어)로 변환
- 인터프리터 방식: 소스코드를 빌드 시에는 아무것도 하지않다 런타임시에 한줄씩 변환
컴파일 방식과 인터프리터 방식의 장단점
인터프리터 | 컴파일 | |
특징 | 코드를 한줄 씩 읽어나가며 실행 | 소스코드 전체를 한번에 번역 |
번역속도 | 빠르다 | 느리다 |
실행속도 | 느리다 | 빠르다 |
종속성 | 플랫폼(하드웨어)에 종속적이지 않음 | 플랫폼(하드웨어)에 종속적 |
바이트코드로 번역된 코드를 캐싱 후 반복적으로 쓰이는 함수와 클래스 등의 기계어코드의 캐싱해둔 값을 사용하여 매번 기계어 코드가 생성되는 것을 방지해 인터프린트 시간을 단축시킨다.
인터프리터 조건
JVM이 호출되는 메서드 각각에 대해 호출마다 호출 횟수를 누적해서 그 횟수가 특정 수치(컴파일 임계치)를 초과 할 때 컴파일을 하는데 얼마나 자주 호출되는지 검사 후
컴파일 임계치
- method entry counter ( JVM 내에 있는 메서드가 호출된 횟수)
- back-edge loop counteer ( 메서드가 루프를 빠저나오기까지 루프 한 횟수 )
위의 두 카운터의 합계를 확인하고 메서드가 컴파일 될 자격이 있는지 결정 메서드가 컴파일될 조건이 맞으면 해당 메서드는 컴파일되기 위하여 큐에서 대기한다.
JIT 컴파일을 확인해보자
1) 먼저 아래 코드를 작성
public class Test{
public static void main(String [] args){
for(int i = 0; i < 1000; i++){
f1();
}
}
private static void f1(){
int a = 10;
int b = 1241412;
for(int i = 0; i <1000; i++){
int c = a*b;
}
}
}
2) 커맨드창에서 컴파일
javac C:\godofjava\c\Test.java
3) 커맨드창에서 일단 이렇게 입력해보자
java -Xint -XX:+PrintCompilation C:\godofjava\c\Test.java
4) 아래와 같이 화면이 나온다.
[결과]
위 컴파일된 결과를 본다면 첫번째 열은 가상머신이 시작된 이후 경과된 시간(밀리초) 두번째열은 컴파일된ID이다 이 값이 순서대로 정렬되어있지 않은 경우는 다른부분보다 컴파일하는 시간이 오래 경과되었다는 것 멀티스레딩이나 컴파일되는 코드의 복잡성 또는 길이로 인하여 발생할 수 있다
[느낀점]
JIT 컴파일러의 작동방식의 세부 내용, JIT 컴파일러의 최적화 등 모르는 것이 많아 좀더 글을 수정 업데이트 해야겠습니다
참조사이트
https://gist.github.com/rednaxelafx/1165804#file_notes.md
PrintCompilation samples running Groovy shell 1.7.7 on different versions of HotSpot VM
PrintCompilation samples running Groovy shell 1.7.7 on different versions of HotSpot VM - JDK5u22_client.log
gist.github.com
JIT 컴파일러와 코드 캐시
Compilation자바 코드를 컴파일러(javac)를 사용하여 컴파일하면 바이트 코드(class 파일)로 컴파일된다.그리고 JVM이 해당 자바 바이트코드를 인터프리팅하며 애플리케이션이 실행된다.그러므로 자바
velog.io
https://catch-me-java.tistory.com/11
[Java-3] JVM과 JIT 컴파일러란?
전 글에서는 JAVA의 바이트 코드에 대해서 알았다. 이번에는 그 바이트코드를 가지고 어떻게 실행하는지 알아보기 위해, 기본적인 JVM의 JIT 에 대해서 알아보도록 하자. 먼저 실행을 하기 위해서
catch-me-java.tistory.com
https://beststar-1.tistory.com/3
JIT(Just In Time) 컴파일러
목차 배경 지난번 JVM 메모리 영역의 역할과 구조에 대해 알아봤다. beststar-1.tistory.com/14 JVM(Java Virtual Machine, 자바 가상 머신) - 3. 메모리 영역 목차 배경 지난번 JVM의 클래스로더 시스템의 역할과
beststar-1.tistory.com
https://junshock5.tistory.com/111
Jit 컴파일러란? 최적화 튜닝에 대해서
*JIT(Just In Time Compiler 개념 및 튜닝) 한 번만 실행될 코드라면 인터프리터가 빠르다, 하지만 많이 실행될 코드라면 컴파일을 하는것이 좋다. JIT(그때그떄, 그래서 언제?) 핫스팟 JVM은 코드를 바로
junshock5.tistory.com