4

有可用的标志提供有关已编译方法的日志信息。有关未编译的方法以及为什么未编译的方法的信息在哪里?能够看到热点编译器如何做出决定以及它不编译某些方法的原因将使我对 JVM 有更好的理解,并允许我编写更好的代码并可能优化我的一些方法。有人对这个问题有任何想法吗?

4

2 回答 2

3

根据:http ://blog.headius.com/2009/01/my-favorite-hotspot-jvm-flags.html

-XX:+PrintCompilation打印出 Hotspot 决定进行 JIT 编译的每个 Java 方法的名称。该列表最初通常会显示一堆核心 Java 类方法,然后转向应用程序中的方法。

我个人的看法是,这只会浪费你很多时间。如果您使用最佳实践和一些常识进行编码,然后如果性能是一个问题,请分析。你应该做得很好。

于 2010-06-29T02:05:45.097 回答
1

答案是,如果方法没有被执行足够多的时间,它们可能不会被编译。本机代码缓存是有限的,因此编译每个方法都会适得其反;您最终可能会得到许多已编译的方法,但重要的方法不再适合缓存大小。

确切的数字因版本而异,但如果您使用 Java 运行,-XX:+PrintFlagsFinal您将看到所有可以调整的设置,包括Tier3CompileThreshold(其值为 2000)Tier4CompileThreshold(其值为 15000)。因此,如果您调用方法的次数不超过 2000 次,它只会使用解释器来处理它。

如果您想在 JIT 条件下执行分析,那么您需要执行大量循环调用这些方法才能看到好处,或者使用诸如JMH之类的分析工具来正确地进行分析。

于 2016-04-13T12:16:13.283 回答