JVM(尤其是 HotSpot VM)因其可在运行时应用的大量优化而闻名。
有没有办法查看某段代码并了解 JVM 实际上对其做了什么?
一个问题是“JVM 实际对它做了什么”在调用之间发生变化,因为 JVM 可以自由地重新生成代码。
举个例子,几天前我研究了 Hotspot 使用
final
方法与虚拟方法相比的作用。从微基准来看,我的结论是:
客户端 JVM:如果该方法是有效
final
(没有任何加载的类覆盖它),则 JVM 使用非虚拟调用。之后,如果您加载覆盖此方法的类,JVM 将更改 JIT 代码以使调用虚拟。因此声明为 final
没有显着相关性。服务器JVM:这里
final
似乎也没有相关性。似乎发生的情况是,JVM 为您第一次使用的任何类生成一个非虚拟调用,与加载的任何类无关。之后,如果您从另一个类的对象进行调用,JVM 将使用与此类似的内容来修补所有调用(我猜它还会分析调用,以便在没有获得调用时可以更改快速路径和慢速路径)第一次就对了):
如果您确实对查看生成的代码感兴趣,您可以使用 OpenJDK 中的 DEBUG JVM:http://dlc.sun.com.edgesuite.net/jdk7/binaries/index.htmlhttp://wikis.sun.com/display/HotSpotInternals/PrintAssembly