【发布时间】:2016-04-13 20:16:13
【问题描述】:
有一些可用的标志可提供有关已编译方法的日志信息。有关未编译的方法以及为什么未编译的方法的信息在哪里?能够看到热点编译器如何做出决定以及它不编译某些方法的原因将使我对 JVM 有更好的理解,并允许我编写更好的代码并可能优化我的一些方法。有人对这个问题有任何想法吗?
【问题讨论】:
标签: java compiler-construction jit jvm-hotspot openjdk
有一些可用的标志可提供有关已编译方法的日志信息。有关未编译的方法以及为什么未编译的方法的信息在哪里?能够看到热点编译器如何做出决定以及它不编译某些方法的原因将使我对 JVM 有更好的理解,并允许我编写更好的代码并可能优化我的一些方法。有人对这个问题有任何想法吗?
【问题讨论】:
标签: java compiler-construction jit jvm-hotspot openjdk
根据:http://blog.headius.com/2009/01/my-favorite-hotspot-jvm-flags.html
-XX:+PrintCompilation 打印出每个Java方法Hotspot的名字 决定JIT编译。该名单将 通常展示一堆核心Java 最初的类方法,然后转 应用程序中的方法。
我个人认为,这只会浪费你很多时间。如果您使用最佳实践和一些常识进行编码,然后如果性能是一个问题,请配置文件。你应该做得很好。
【讨论】:
答案是,如果方法执行的次数不够多,则可能无法编译它们。本机代码缓存是有限的,因此编译每个方法都会适得其反;您最终可能会得到许多已编译的方法,但重要的方法不再适合缓存大小。
具体数字因版本而异,但如果您使用 -XX:+PrintFlagsFinal 运行 Java,您将看到所有可以调整的设置,包括 Tier3CompileThreshold(其值为 2000)Tier4CompileThreshold(其值为 15000)。因此,如果您调用方法的次数不超过 2000 次,它只会使用解释器来处理它。
如果您想在 JIT 条件下执行分析,那么您需要执行大量循环调用这些方法才能看到好处,或者使用诸如 JMH 之类的分析工具来正确地进行分析。
【讨论】: