私は、ユーザーのJesperの提案に続き、このコードでて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
ではありません。
のJava 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