楼主对方法内联的概念理解有误,原代码如下:class A { int value; public final int get(){ return value; } }public class B { public void sum() { A a=new A(); int x=a.get(); int y = a.get(); int sum= x+y; } }方法内联后的代码如下:class A { int value; public final int get(){ return value; } }public class B { public void sum() { A a=new A(); int x=a.value; int y = a.value; int sum= x+y; } } Java编译器会对编译的类进行类继承关系分析,当确认class A的方法get只有一个版本(不是抽象方法也没有重写,我是直接定义final达到此效果),就会进行方法内联编译优化。楼主的代码例子应该是属于Java虚拟机的运行优化,System.out.println(i);,应该属于热点代码,虚拟机可能会将这个代码编译本地代码来执行。
{
int value;
public final int get(){
return value;
}
}public class B
{
public void sum()
{
A a=new A();
int x=a.get();
int y = a.get();
int sum= x+y;
}
}方法内联后的代码如下:class A
{
int value;
public final int get(){
return value;
}
}public class B
{
public void sum()
{
A a=new A();
int x=a.value;
int y = a.value;
int sum= x+y;
}
}
Java编译器会对编译的类进行类继承关系分析,当确认class A的方法get只有一个版本(不是抽象方法也没有重写,我是直接定义final达到此效果),就会进行方法内联编译优化。楼主的代码例子应该是属于Java虚拟机的运行优化,System.out.println(i);,应该属于热点代码,虚拟机可能会将这个代码编译本地代码来执行。
我得到的反编译的代码,是编译器已经优化好了的代码,
而无法根据这个结果,反推回本身源代码的样子。
另外:
我那个System.out.println只是个例子,代表“在这个位置有一些操作”
并不是实际真正的代码。呵呵是我没说清楚,我检讨
嗯,
这个优化是标准java编译器本身自带的呢?
还是第三方编译器的功能呢?类似以前tomcat用另外的jsp编译器(名字忘了)处理jsp文件那样
嗯,
这个优化是标准java编译器本身自带的呢?
还是第三方编译器的功能呢?类似以前tomcat用另外的jsp编译器(名字忘了)处理jsp文件那样刚查了一下书,发现找不到这个说法的出处了。。不过我觉得应该是发生在编译期间的优化吧,应该是由编译器带来的
嗯,
这个优化是标准java编译器本身自带的呢?
还是第三方编译器的功能呢?类似以前tomcat用另外的jsp编译器(名字忘了)处理jsp文件那样Java的编译器有:
ECJ(eclipse的编译器)、JIT编译器(Hotspot虚拟机的C1、C2编译器),AOT编译器(GCJ、JET等)。
嗯,
这个优化是标准java编译器本身自带的呢?
还是第三方编译器的功能呢?类似以前tomcat用另外的jsp编译器(名字忘了)处理jsp文件那样Java的编译器有:
ECJ(eclipse的编译器)、JIT编译器(Hotspot虚拟机的C1、C2编译器),AOT编译器(GCJ、JET等)。都没听说过
嗯,
这个优化是标准java编译器本身自带的呢?
还是第三方编译器的功能呢?类似以前tomcat用另外的jsp编译器(名字忘了)处理jsp文件那样Java的编译器有:
ECJ(eclipse的编译器)、JIT编译器(Hotspot虚拟机的C1、C2编译器),AOT编译器(GCJ、JET等)。都没听说过
恩,主要是我们无法在程序中使用,只能了解,内联优化跟代码的重复性无关,只跟方法的版本有关,重复性代码是Java虚拟机的热点追踪技术和即时编译JIT有关。内联优化是编译器的优化、JIT是运行时的Java虚拟机的优化。