我听到很多关于JVM JIT 可以做什么的事情,但是没有看到很多关于如何分析JIT在程序的给定运行中实际执行的操作的信息。有很多关于使用-XX:+PrintCompilation
和-XX:+PrintOptoAssembly
的提示,但它会产生难以解释的真正低级别的信息。
通常,在优化期间,我喜欢使用具有专用JIT预热时间等的常用操作的基准测试套件,但我希望能够看到哪些优化实际上触发了我的代码。也许我的JVM考虑内联一个特定的方法调用,但它的一些东西使它决定不,或者JIT无法避免我的循环中的数组边界检查,因为我的措辞我的不变量和循环条件太模糊。我希望像YourKit这样的工具能够支持某些形式的“JIT正在发生的事情”,但我无法在YourKit或其他任何地方找到支持。
理想情况下,我只是喜欢JIT优化器在我的程序运行期间所想的大脑转储。假设我已经充分预热了我的功能,它决定将三个方法内联到我的内循环中并将循环分成三个部分,中间部分没有数组边界检查,我想要总结这些决定和动机对他们来说。
我错过了一些明显的东西吗? JVM性能感知程序员在优化紧密内循环以找出正在发生的事情时会做些什么?当然,低级-XX
标志不是唯一的选择,是吗?我很欣赏有关如何最好地处理JVM上的这种低级内容的提示。不,这个问题不是过早优化的动机! :)
编辑:我想我想要的一些内容是-XX:+LogCompilation
给出的,但我仍然很好奇人们是否有这类活动的一般提示和工具。
答案 0 :(得分:3)
如果你想要一个脑转储,你可以打印生成的汇编代码,但这比你已经 更低。我怀疑HotSpot JVM不存在你要找的东西。我看到了一个基于JRockit的类似内容的演示文稿,也许有一天它会进入HotSpot。
我错过了一些明显的东西吗? JVM性能感知程序员在优化紧密内循环以找出正在发生的事情时会做些什么?
通常,我喜欢减少垃圾产生,这通常表现得很好。例如微秒延迟。
这种微优化确实需要深入了解机器代码以及CPU如何真正起作用。
当然,低级-XX标志不是唯一的选择,可以吗?
如果只是那么简单,那就复杂得多了。要转储机器代码,您需要一个不附带JVM的其他本机库。 ;)
我很欣赏有关如何最好地处理JVM上的这种低级内容的提示。
看来你真的不想在低水平工作,如果你可以避免它,我相信这是一件好事,你必须首先照顾高水平,因为微优化对微观有利基准测试但很少适用于实际应用程序,因为您需要了解端到端系统的所有延迟,而且在很多情况下您甚至无需查看代码。即数据库,操作系统,磁盘或网络IO中的主要延迟。
如果人们有这种活动的一般提示和工具,我仍然很好奇。
使用分析器,如果您怀疑需要降低分量,很可能您错过了更为重要的东西。