Java 编译器是否通过删除方法来优化调用一次的方法?

Does the Java compiler optimization a method called once by removing the method?

java 编译器(任何主流编译器)会采用类似

的东西吗?
void foo () {
    int x = 1;
    System.out.println(x);
}

void bar() {
    foo()
}

如果仅在 bar 中调用 foo 方法,则优化 foo 方法,从而导致字节码也由此生成:

void bar() {
    int x = 1;
    System.out.println(x);
}

不,不是。除了常量折叠之外,Javac 没有做太多优化。在 java 中,优化在运行时使用 JIT 进行。

我创建了一个简短的示例来展示该方法如何没有被内联到字节码中,即使它只被调用了一次。 Private 和 public 没有区别。

Compiled from "Test.java"
public class Test {
  public Test();
    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: ldc           #3                  // String Hello before method
       5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: invokestatic  #5                  // Method publicMethod:()V
      11: invokestatic  #6                  // Method privateMethod:()V
      14: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
      17: ldc           #7                  // String Hello after method
      19: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      22: return

  public static void publicMethod();
    Code:
       0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #8                  // String The public method
       5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return

  private static void privateMethod();
    Code:
       0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #9                  // String The private method
       5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return
}