Java

인터프리터의 느린 방식의 대처방안: JIT(Just In Time) 컴파일러

prodonghwa 2024. 6. 30. 20:16

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

https://velog.io/@lucius__k/JIT-%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC%EC%99%80-%EC%BD%94%EB%93%9C-%EC%BA%90%EC%8B%9C

 

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