如何找出JVM应用于我的代码的哪些优化?
-
01-10-2019 - |
题
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进行播放:
其他提示
这是非常特定于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概述”链接(我刚刚注册时无法发布直接链接)。
不隶属于 StackOverflow