java优化怎么样?示例代码

时间:2017-03-30 13:52:14

标签: java compilation bytecode compiler-optimization

考虑这个小班:

public class Example {
  public int plus(int a){
    int b;
    b = 1;
    return b+a;
  }
}

javap说:

public int plus(int);
  descriptor: (I)I
  flags: ACC_PUBLIC
  Code:
    stack=2, locals=3, args_size=2
     0: iconst_1
     1: istore_2
     2: iload_2
     3: iload_1
     4: iadd
     5: ireturn
  LineNumberTable:
    line 4: 0
    line 5: 2

我不明白为什么我们需要第1行和第2行?

我听说Java Runtime环境会计算函数调用,如果它们超过一定数量的调用就会编译函数。

这是否意味着Java编译器将所有优化都留给了字节码编译器?例如。 Java程序开始变慢并且随着时间的推移变得更快?

请解释一下!

1 个答案:

答案 0 :(得分:3)

首先,您正在查看字节码编译器的输出。典型的Java字节码编译器几乎不做任何优化。重量级优化由JIT编译器在运行时完成。

因此,javap -c显示的内容是未经优化的字节码。

  

我不明白为什么我们需要第1行和第2行?

您正在查看未经优化的字节码。前2条指令将1分配给局部变量b。我们可以看到局部变量可以很容易地被优化掉。但是字节码编译器(javac)不会打扰。

  

我听说Java Runtime环境会计算函数调用,如果它们超过一定数量的调用就会编译函数。

这就是典型的Hotspot JVM的工作原理。

  

这是否意味着Java编译器将所有优化都留给了字节码编译器?

没有。 JIT编译器执行运行时编译和相关优化。

字节码编译器将Java源代码编译为字节码。 JIT编译器在运行时将字节码编译为本机代码。

  

E.g。 Java程序开始变慢并且随着时间的推移变得更快?

这是正确的。初始字节码解释阶段和JIT编译是所谓的“JVM预热”的一部分。

(根据要求......)

字节码编译器未优化的原因包括:

  • 因为JIT编译器进行优化(因此会浪费精力),
  • 因为优化字节码可能使得在JIT编译器中更难优化(“聪明”代码比简单代码更难优化),并且
  • 因为非优化的字节代码使分析器或调试器更容易将代码与源代码行相关联。

JIT编译器进行优化的原因包括:

  • 因为需要在生成本机代码以实现最佳结果的步骤中完成,
  • 因为它取决于平台(例如,最佳代码取决于目标指令集,并且可能取决于内存高速缓存大小,内核数量等),以及
  • 因为它允许您根据代码执行时的观察行为进行优化(例如,改进的分支预测)。

最后,JIT编译与Java的后期绑定模型很吻合。