我听到很多关于 JVM JIT可以做什么的信息,但没有看到很多关于如何分析 JIT 在给定程序运行中实际执行的操作的信息。有很多关于使用的技巧-XX:+PrintCompilation
,-XX:+PrintOptoAssembly
但它会导致很难解释的非常低级的信息。
一般来说,在优化过程中,我希望有一套具有专用 JIT 预热时间等的通用操作基准套件,但我希望能够查看哪些优化实际上是在我的代码上触发的。也许我的 JVM 考虑过内联一个特定的方法调用,但它决定不这样做,或者 JIT 无法避免在我的循环中进行数组边界检查,因为我对不变量和循环条件的表述过于模糊。我希望像 YourKit 这样的工具能够支持某种形式的“JIT 发生了什么”,但我无法在 YourKit 或其他任何地方找到对它的支持。
理想情况下,我只想了解 JIT 优化器在我的程序运行期间的想法。假设我已经充分预热了我的函数,它决定将三个方法内联到我的内部循环中,并将循环分成三个部分,中间部分没有数组边界检查,我想总结一下这些决定和动机为他们。
我在这里遗漏了一些明显的东西吗?在优化紧密的内部循环以弄清楚发生了什么时,JVM 性能感知程序员会做什么?当然,低级-XX
标志不能是唯一的选择,不是吗?我很感激有关如何最好地处理 JVM 上的此类低级内容的提示。不,这个问题的动机不是过早优化!:)
编辑:我想我想要的一些东西是由给出的,-XX:+LogCompilation
但我仍然很好奇人们是否有这种活动的一般提示和工具。