JVM(尤其是Hotspot VM)以其在运行时进行大量优化而闻名。

有没有办法查看某个代码并查看JVM实际对其做了什么?

有帮助吗?

解决方案

一个问题是,“ 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

其他提示

这是非常特定于JVM的,您很可能需要在您正在查看的特定JVM中进行一些认真的调查。

您可以在此处查看可用的热点VM选项 http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

以下是一个很好的资源:

http://wikis.sun.com/display/hotspotinternals/home

特别有趣的是“ LogCompilation Tool”和“ LogCompilation概述”链接(我刚刚注册时无法发布直接链接)。

这是一个很好的页面 热点优化。通过查看编译器发出的字节码,可以看到一些优化。其他优化是动态的,仅在运行时存在。例如,热点可以做 堆栈更换 这在运行时直接修改堆栈。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top