如何找出JVM应用于我的代码的优化?

soc*_*soc 10 java compiler-construction optimization jvm vm-implementation

JVM(尤其是HotSpot VM)因其在运行时可以应用的大量优化而闻名.

有没有办法查看某段代码,看看JVM实际上对它做了什么?

gpe*_*che 6

一个问题是"JVM实际上对它做了什么"在调用之间发生变化,因为JVM可以自由地重新生成代码.

作为一个例子,我几天前调查了Hotspot与final虚拟方法相比的方法.从微观基准来看,我的结论是:

  • 客户端JVM:如果方法是有效的 final(没有任何加载的类覆盖它),则JVM使用非虚拟调用.之后,如果您加载一个覆盖此方法的类,JVM将更改JIT代码以使调用成为虚拟.因此宣称final没有重大意义.

  • 服务器JVM:这final似乎也没有相关性.似乎发生的情况是,JVM为您第一次使用任何类生成非虚拟调用,而与所加载的类无关.之后,如果你从另一个类的对象进行调用,JVM将使用与此类似的东西来修补所有调用(我猜它也将调用调用,以便它可以更改快速路径和慢速路径,如果它没有得到这是第一次):

    if (object instanceof ClassOfNonVirtualCall) {
        do non-virtual call to ClassOfNonVirtualCall.method
    } else {
        do virtual call to object.method
    }

如果您真的对查看生成的代码感兴趣,可以使用OpenJDK中的DEBUG JVM:

http://dlc.sun.com.edgesuite.net/jdk7/binaries/index.html

http://wikis.sun.com/display/HotSpotInternals/PrintAssembly