나는 사용자 예스퍼의 제안을 따라이 코드에은 javap 사용하고 있습니다 :
package stackoverflow;
public class CompilerOptimize {
public static void main(String[] args){
System.out.println(sayHello());
}
private static String sayHello(){
return "Hello World";
}
private static void bananas() {
System.out.println("Monkey!");
}
}
방법 sayHello
를 사용하고, bananas
는 없습니다.
자바 8 컴파일 된 클래스에 -p 매개 변수은 javap 실행의 결과는 다음과 같습니다
public class stackoverflow.CompilerOptimize {
public stackoverflow.CompilerOptimize();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: invokestatic #3 // Method sayHello:()Ljava/lang/String;
6: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
9: return
private static java.lang.String sayHello();
Code:
0: ldc #5 // String Hello World
2: areturn
private static void bananas();
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #6 // String Monkey!
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}
방법 bananas
은 (sayHello
도있다) 바이트 코드 주석에 언급되어있다.
컴파일러는 사용되지 않는 개인 메소드를 최적화 할 예정입니까?
아니요.
이 메소드가 컴파일러에 의해 인라인되고 있다고 생각합니까? 그것은 인라이닝을하지 않습니다. 인라이닝은 런타임시 JIT 컴파일러에서 발생할 수 있습니다. –
당신은'javap'을 사용하여 컴파일 된 클래스를 역 어셈블함으로써 스스로 시도 할 수 있습니다. 대부분 방법을 폐기하지 않을 것입니다. – Jesper
컴파일러 최적화는 결코 동작을 변경하지 않습니다. – 4castle