如何找出 JVM 对我的代码应用了哪些优化?

问题描述 投票:0回答:4

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

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

java optimization jvm vm-implementation
4个回答
6
投票

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

举个例子,几天前我研究了 Hotspot 使用

final
方法与虚拟方法相比的作用。从微基准来看,我的结论是:

  • 客户端 JVM:如果该方法是有效

    final
    (没有任何加载的类覆盖它),则 JVM 使用非虚拟调用。之后,如果您加载覆盖此方法的类,JVM 将更改 JIT 代码以使调用虚拟。因此声明为
    final
    没有显着相关性。

  • 服务器JVM:这里

    final
    似乎也没有相关性。似乎发生的情况是,JVM 为您第一次使用的任何类生成一个非虚拟调用,与加载的任何类无关。之后,如果您从另一个类的对象进行调用,JVM 将使用与此类似的内容来修补所有调用(我猜它还会分析调用,以便在没有获得调用时可以更改快速路径和慢速路径)第一次就对了):

  • if (ClassOfNonVirtualCall 的对象实例) { 对 ClassOfNonVirtualCall.method 进行非虚拟调用 } 别的 { 对 object.method 进行虚拟调用 }
如果您确实对查看生成的代码感兴趣,您可以使用 OpenJDK 中的 DEBUG JVM:

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

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


4
投票

您可以在此处查看可用的 HotSpot VM 选项

http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html


3
投票

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

特别有趣的是“LogCompilation 工具”和“LogCompilation 概述”链接(无法发布直接链接,因为我刚刚注册)。


2
投票
HotSpot optimizations

的好页面。 通过查看编译器发出的字节码可以看到一些优化。 其他优化是动态的,仅在运行时存在。 例如,HotSpot 可以进行“堆栈上替换”,即在运行时直接修改堆栈。

© www.soinside.com 2019 - 2024. All rights reserved.