如何检查Java中JIT编译器是否关闭

9

我想知道如何检查JIT编译器是否已关闭。我有以下代码,旨在关闭JIT编译器。问题是,我不确定它是否实际上做到了这一点。所以我想知道是否有一种方法来检查JIT是否关闭。

我查看了Compiler类,但没有像isDisabled/enabled()这样的方法。

代码:

Compiler.disable();  

非常感谢您的帮助和指导。


你想在运行时检查这个吗? - Louis Wasserman
是的,我想在运行时检查它。 - isaiah
1
也许我应该解释一下为什么要这样做。基本上,我们有一个程序,旨在根据数据大小计时运行算法(例如快速排序)。我们注意到,前两次结果与其他结果相比非常偏差,我们认为这是由于JIT编译器的初始化造成的。因此,我们想看看在关闭JIT时时间的影响。 - isaiah
这并不是一个布尔类型的事情,方法在不同的层次上得到优化和去优化。最好使用支持预热的基准测试工具。我会使用JMH。它甚至有编译器控制注释。 - eckes
在运行时检查的另一个原因是,我的应用程序在某个时间点似乎会切换到仅解释模式。我已经追踪到了一个与此相关的JIT错误(https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8023983)。我想知道是否有什么东西“whomped”内存并覆盖了该标志。 - pojo-guy
5个回答

22
(这不是直接回答你的问题,因为你似乎试图以编程方式关闭JIT编译器,但根据你的评论,这可能很有趣。) 如果您想在Sun/Oracle JVM上关闭JIT编译器,您应该尝试-Xint选项: -Xint 只以解释模式运行。禁用编译到本机代码,并且所有字节码都由解释器执行。 Java HotSpot Client VM的自适应编译器提供的性能优势在此模式下不会存在。

这个支持到哪个版本的Java?因为我收到了“javac: invalid flag: -Xint”的错误提示。 - Erik Kaplun
1
@ErikAllik 当您在Oracle JRE 8中键入java -X时,选项可用。是否使用JIT编译器是JRE决策,这与将源代码编译为字节码(javac的工作)无关:您可能会因为使用javac而不是java而遇到此错误。 - Bruno
哦糟糕...你完全正确;我现在感觉很愚蠢;我知道你说的一切 :) - Erik Kaplun

10

我不相信您可以在运行时关闭JIT。

如果您想严肃地对Java程序进行基准测试,应该忽略前几次运行。在Java中获得可靠的基准测试结果是一项非常棘手的工作,最好交给比您和我聪明得多的人来完成。

我建议使用Caliper,它在Google内部用于微基准测试,并且非常擅长热身JIT等方面。特别是,请参阅此处的示例,展示了如何测量不同输入大小下算法的效率。


谢谢Louis。这是我的毕业项目。我们实际上也考虑忽略前几次运行。我想现在这是最简单的选择。我还会看看Caliper。 - isaiah
这个项目是在实现算法还是在进行基准测试? - Louis Wasserman
基本上是使用反射运行用户的算法,然后根据O符号进行分析。另外,让我困惑的是,在IBM的网站上(http://publib.boulder.ibm.com/infocenter/realtime/v1r0/index.jsp?topic=%2Fcom.ibm.rt.doc.10%2Frealtime%2Frt_jit.html),它确实说明了如何关闭JIT编译器,或者我误解了信息? - isaiah
如果代码缓存用尽,它就会关闭。在这种情况下,它会打印出“CodeCache已满。编译器已被禁用”。 - juancn

10
在文章《性能特性和工具》中。
JIT编译器最初作为Java Development Kit (JDK) 1.1.6软件版本的性能更新首次发布,现在是在Java 2平台版本中使用java解释器命令时调用的标准工具。
你可以使用-Djava.compiler=NONE选项来禁用JIT编译器。因此,可以推断出当变量未设置或设置为非NONE时,则启用JIT编译器。

是的,它正在工作。如何知道Djava.compiler的当前值? - apm

7
IBM的JVM支持Java 5中引入的java/lang/Compiler.disable()和.enable()接口,这当然包括WebSphere Real Time(它是一种旨在提供更可预测性能的JVM)以及我们的“标准”JVM。如果您调用disable()方法,则会阻止JIT编译,直到您调用enable()方法为止。
我在JIT编译器团队中工作。我们通常不建议人们使用此接口,因为干扰JIT编译启发式算法通常不是个好主意,但在合理的实时场景下,您会使用它。

5

当方法编译完成时,您可以使用`-XX:+ PrintCompilation`将其打印出来。如果您的方法未被打印出来,或在打印后突然变得更快,则可以查看可能的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接