昨天解释了下JAVA的解释执行但其总体来说效率较低,为提升性能,JDK提供了将字节码编译为机器码,一种运行时编译的功能(JIT(just-in-time)编译器)--对执行频率高的代码进行JIT编译,反之的则继续解释执行。
在JIT编译上JAVA提供了2种模式:C1(clientcompiler)和C2(server compiler)。
C1:采用线性扫描寄存器分配算法(对这个算法暂时还没研究所以这里不讨论开去了,主要讲一些其他方面的优化:方法内联、去虚拟化、去冗余代码)。
方法内联:先看一段代码
public void test(){
.....
test2();
.....
}
public void test2(){
....
//test2
....
}
以上代码如果test2方法中编译后的字节数小于默认的35个字节则编译后结构会变成如下:
public void test(){
.....
test2;
.....
}
这样就是方法内联了
稍微优化了一下,当然那个35字节是可以修改的命令为-XX:MaxInlineSize=35来控制。
去虚拟化:在Class文件被转载后,对类的层次结构进行分析,如果类的方法只提供一个实现类,那么对调用此方法的代码也可以进行方法内联,从而提高性能。看一段代码想必大家就会有点明了了:
接口的实现往往会有很多如果只有一个实现类的话那么就能方法内联了,
public interface TestInterface(){