Java Virtual Machine-JIT 최적화
이 장에서는 JIT 최적화에 대해 알아 봅니다.
메서드 인라이닝
이 최적화 기술에서 컴파일러는 함수 호출을 함수 본문으로 대체하기로 결정합니다. 아래는 동일한 예입니다.
int sum3;
static int add(int a, int b) {
return a + b;
}
public static void main(String…args) {
sum3 = add(5,7) + add(4,2);
}
//after method inlining
public static void main(String…args) {
sum3 = 5+ 7 + 4 + 2;
}
이 기술을 사용하여 컴파일러는 함수 호출을 수행하는 오버 헤드로부터 머신을 저장합니다 (파라미터를 스택에 푸시하고 팝해야 함). 따라서 생성 된 코드가 더 빠르게 실행됩니다.
메서드 인라인은 가상이 아닌 함수 (무시되지 않는 함수)에 대해서만 수행 할 수 있습니다. 'add'메서드가 하위 클래스에서 재정의되고 메서드가 포함 된 개체의 유형이 런타임까지 알려지지 않은 경우 어떤 일이 발생할지 고려하십시오. 이 경우 컴파일러는 인라인 할 메서드를 알지 못합니다. 그러나 메서드가 'final'로 표시된 경우 컴파일러는 하위 클래스에 의해 재정의 될 수 없기 때문에 인라인 일 수 있음을 쉽게 알 수 있습니다. 최종 메서드가 항상 인라인된다는 보장은 전혀 없습니다.
도달 할 수없는 데드 코드 제거
도달 할 수없는 코드는 가능한 실행 흐름에서 도달 할 수없는 코드입니다. 우리는 다음 예를 고려할 것입니다.
void foo() {
if (a) return;
else return;
foobar(a,b); //unreachable code, compile time error
}
데드 코드도 도달 할 수없는 코드이지만이 경우 컴파일러는 오류를 내 보냅니다. 대신 경고 만받습니다. 생성자, 함수, try, catch, if, while 등과 같은 각 코드 블록에는 JLS (Java Language Specification)에 정의 된 도달 할 수없는 코드에 대한 자체 규칙이 있습니다.
일정한 접기
상수 접기 개념을 이해하려면 아래 예를 참조하십시오.
final int num = 5;
int b = num * 6; //compile-time constant, num never changes
//compiler would assign b a value of 30.