Hotspot JVM未编译方法的原因

4

有一些标志可以提供已编译方法的日志信息。那么没有编译的方法的信息在哪里?为什么它们没有被编译?能够了解热点编译器的决策过程和未编译某些方法的原因,可以更好地理解JVM,并编写更好的代码,可能还可以优化一些方法。有人对这个问题有什么想法吗?

2个回答

3
根据http://blog.headius.com/2009/01/my-favorite-hotspot-jvm-flags.html-XX:+PrintCompilation会打印出Hotspot决定JIT编译的每个Java方法的名称。该列表通常会显示一堆核心Java类方法,然后转向应用程序中的方法。
我个人认为这只会浪费你很多时间。如果你使用最佳实践和一些常识进行编码,然后如果性能有问题,请进行剖析。你应该做得很好。

1
但是,据说它不会打印关于未编译方法(以及为什么它们未被编译)的信息,这正是问题所在。 - valiano

1
答案是,如果方法没有被执行足够的次数,则可能无法编译。本地代码缓存是有限的,因此编译每个方法是适得其反的;您可能会发现有许多已经编译但重要方法不再适合缓存大小的方法。
确切的数字因版本而异,但如果您使用 -XX:+PrintFlagsFinal 运行Java,则将看到所有可以调整的设置,包括 Tier3CompileThreshold(值为2000)Tier4CompileThreshold(值为15000)。因此,如果您不调用方法超过2000次,则只需使用解释器来执行它。
如果您想在JIT条件下执行分析,则需要执行大量循环调用方法以查看效果,或者使用像JMH这样的分析工具来正确进行分析。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接