6

我听到很多关于 JVM JIT可以做什么的信息,但没有看到很多关于如何分析 JIT 在给定程序运行中实际执行的操作的信息。有很多关于使用的技巧-XX:+PrintCompilation-XX:+PrintOptoAssembly但它会导致很难解释的非常低级的信息。

一般来说,在优化过程中,我希望有一套具有专用 JIT 预热时间等的通用操作基准套件,但我希望能够查看哪些优化实际上是在我的代码上触发的。也许我的 JVM 考虑过内联一个特定的方法调用,但它决定不这样做,或者 JIT 无法避免在我的循环中进行数组边界检查,因为我对不变量和循环条件的表述过于模糊。我希望像 YourKit 这样的工具能够支持某种形式的“JIT 发生了什么”,但我无法在 YourKit 或其他任何地方找到对它的支持。

理想情况下,我只想了解 JIT 优化器在我的程序运行期间的想法。假设我已经充分预热了我的函数,它决定将三个方法内联到我的内部循环中,并将循环分成三个部分,中间部分没有数组边界检查,我想总结一下这些决定和动机为他们。

我在这里遗漏了一些明显的东西吗?在优化紧密的内部循环以弄清楚发生了什么时,JVM 性能感知程序员会做什么?当然,低级-XX标志不能是唯一的选择,不是吗?我很感激有关如何最好地处理 JVM 上的此类低级内容的提示。不,这个问题的动机不是过早优化!:)

编辑:我想我想要的一些东西是由给出的,-XX:+LogCompilation但我仍然很好奇人们是否有这种活动的一般提示和工具。

4

1 回答 1

3

如果你想要一个大脑转储,你可以打印生成的汇编代码,但这比你已经拥有的要低得多我怀疑 HotSpot JVM 不存在您要查找的内容。我看到了一个基于 JRockit 的演示文稿,也许有一天它会成为 HotSpot。

我在这里遗漏了一些明显的东西吗?在优化紧密的内部循环以弄清楚发生了什么时,JVM 性能感知程序员会做什么?

通常,我喜欢尽量减少垃圾的产生,这通常表现得很好。例如微秒延迟。

这种微优化确实需要深入了解机器代码以及 CPU 的实际工作方式。

当然,低级 -XX 标志不能是唯一的选择,不是吗?

如果只是简单的地方,那就复杂得多了。要转储机器代码,您需要一个不随 JVM 提供的附加本机库。;)

我很感激有关如何最好地处理 JVM 上的此类低级内容的提示。

如果可以避免的话,您似乎并不想在低级别工作,我相信这是一件好事,您必须首先处理高级别,因为微优化对微基准测试有好处,但很少适合实际应用程序,因为您需要了解端到端系统的所有延迟,而在许多情况下,您甚至无需查看代码即可做到这一点。ie 是数据库、操作系统、磁盘或网络 IO 中的主要延迟。

我仍然很好奇人们是否有这种活动的一般提示和工具。

使用分析器,如果你怀疑你需要降低,很可能你错过了一些更重要的东西。

于 2013-04-28T06:56:02.877 回答