【问题标题】:How to check if the JIT compiler is off in Java如何检查 JIT 编译器是否在 Java 中关闭
【发布时间】:2012-02-26 21:37:21
【问题描述】:

我想知道如何检查 JIT 编译器是否已关闭。我有以下代码用于关闭 JIT 编译器。问题是,我不确定它是否真的在这样做。所以我想知道是否有办法检查 JIT 是否关闭。 我查看了 Compiler 类,但没有像 isDisabled/enabled() 这样的方法。

代码:

Compiler.disable();  

任何帮助或指导将不胜感激。

【问题讨论】:

  • 你想在runtime检查这个吗?
  • 是的,我想在运行时检查它。
  • 也许我还应该补充一下我这样做的原因。基本上,我们有一个程序,旨在根据数据的大小计算运行算法(例如快速排序)所需的时间。我们注意到,与其他结果相比,前两次确实存在偏差,我们认为这是由于 JIT 编译器的初始化造成的。因此,我们希望看到 JIT 关闭时对时间的影响。
  • 这不是一个真正的布尔值,方法在不同的层中得到优化和去优化。最好使用支持热身的基准线束。我会使用JMH。它甚至还有编译器控制注解。
  • 在运行时检查的另一个原因是,我有一个应用程序似乎在某个时间点后切换到仅解释模式。我找到了一个似乎相关的 JIT 错误 (bugs.java.com/bugdatabase/view_bug.do?bug_id=8023983)。我想知道是否有什么东西“破坏”了记忆并覆盖了那个标志。

标签: java compiler-construction jit


【解决方案1】:

(不是您问题的直接答案,因为您似乎试图以编程方式关闭 JIT 编译器,但根据您的评论,这可能会引起您的兴趣。)

如果您想在 Sun/Oracle JVM 上关闭 JIT 编译器,您应该尝试-Xint option

-Xint

在仅解释模式下运行。禁止编译为本机代码,所有字节码都由解释器执行。这 Java HotSpot Client VM 的自适应提供的性能优势 在这种模式下编译器将不存在。

【讨论】:

  • 这支持到哪个版本的 Java?因为我收到了javac: invalid flag: -Xint
  • @ErikAllik 在Oracle JRE 8 中输入java -X 时在选项中可用。是否使用JIT 编译器是JRE 的决定,这与将源代码编译成无关字节码(javac 所做的):您可能会收到此错误,因为您使用的是javac 而不是java
  • 哦,废话……你完全正确;我现在感觉迟钝;我知道你说的一切:)
【解决方案2】:

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

如果您想认真地对 Java 程序进行基准测试,您绝对应该忽略前几次运行。在 Java 中获得可靠的基准是一项非常棘手的工作,最好留给比你或我聪明得多的人。

我建议使用Caliper,它在 Google 内部用于微基准测试,并且在预热 JIT 和其他东西方面非常聪明。特别是看示例here,它展示了如何衡量不同输入大小的算法的效率。

【讨论】:

  • 谢谢路易斯。这是我最后一年的项目。我们实际上也考虑过忽略前几次运行。我想这是目前最简单的选择。我也会看看 Caliper。
  • 项目是在实施您正在测量的算法,还是在进行基准测试?
  • 它基本上是使用反射运行用户的算法,然后用 O 表示法对其进行分析。另外,让我感到困惑的是,在 IBM 的网站 (publib.boulder.ibm.com/infocenter/realtime/v1r0/…) 上,它确实说明了如何关闭 JIT 编译器,还是我误解了该消息?
  • 如果你的代码缓存用完了,它可以关闭。在这种情况下,它会打印“CodeCache 已满。编译器已被禁用”
【解决方案3】:

Performance Features and Tools的文章中。

JIT 编译器最初是作为性能更新在 Java Development Kit (JDK) 1.1.6 软件版本,现在是 每当您使用 java 解释器命令时调用的标准工具 Java 2 平台版本。

您可以使用禁用 JIT 编译器 Java VM 的-Djava.compiler=NONE 选项。

因此,您可以推断,当变量未设置或设置为 NONE 以外的其他值时,则启用了 JIT。

【讨论】:

  • 是的。它的工作。如何知道 Djava.compiler 的当前值?
【解决方案4】:

我相信,IBM JVM 肯定支持 Java 5 中引入的 Java 接口 java/lang/Compiler.disable() 和 .enable()。这包括 WebSphere Real Time(一种旨在提供更可预测性能的 JVM)以及我们的“标准”JVM。如果你调用 disable(),它将阻止 JIT 编译,直到你调用 enable()。

我在 IBM 的 JIT 编译器团队工作。我们通常不建议人们使用这个接口,因为干扰 JIT 编译启发式通常不是一个好主意,但有一些合理的实时场景可以使用它。

【讨论】:

    【解决方案5】:

    你可以在编译的时候打印出方法,如果你的方法没有打印出来或者打印出来后突然变快,可以使用`-XX:+PrintCompilation,你可以看到可能的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-21
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 2016-09-17
      • 2011-07-17
      • 2011-07-01
      • 2013-11-13
      相关资源
      最近更新 更多