JVM JIT诊断工具和优化技巧

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

一般来说,在优化期间,我喜欢使用具有专用JIT预热时间等的常用操作的基准套件,但我希望能够看到哪些优化实际上触发了我的代码。 也许我的JVM考虑内联一个特定的方法调用,但它的一些东西使它决定不,或者JIT无法避免我的循环中的数组边界检查,因为我的措辞我的不变量和循环条件太模糊。 我希望像YourKit这样的工具能够支持某些forms的“JIT正在发生的事情”,但我无法在YourKit或其他任何地方找到支持。

理想情况下,我只是喜欢在我的程序运行期间JIT优化器正在思考的大脑转储。 假设我已经充分预热了我的function,它决定将三个方法内联到我的内循环中并将循环分成三个部分,中间部分没有数组边界检查,我想要总结这些决定和动机对他们来说

我错过了一些明显的东西吗? JVM性能感知程序员在优化紧密内循环以确定正在发生的事情时会做些什么? 当然,低级-XX标志不是唯一的选择,可以吗? 我很欣赏有关如何最好地处理JVM上的这种低级内容的提示。 不,这个问题不是因为过早优化而产生的! 🙂

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

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

我错过了一些明显的东西吗? JVM性能感知程序员在优化紧密内循环以确定正在发生的事情时会做些什么?

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

这种微优化确实需要深入了解机器代码以及CPU如何真正起作用。

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

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

我很欣赏有关如何最好地处理JVM上的这种低级内容的提示。

如果你能避免这种情况,你似乎并不想在低水平工作,我相信这是一件好事,你必须首先考虑高水平,因为微优化对微基准测试有好处但很少对于真正的应用程序有好处,因为您需要了解端到端系统的所有延迟,而且在很多情况下您甚至无需查看代码。 即数据库,操作系统,磁盘或网络IO中的主要延迟。

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

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