有没有办法关闭 JIT 编译器,这样做会影响性能吗?

Posted

技术标签:

【中文标题】有没有办法关闭 JIT 编译器,这样做会影响性能吗?【英文标题】:Is there a way to turn off JIT compiler and is there a performance impact by doing so? 【发布时间】:2015-12-16 15:31:18 【问题描述】:

JIT 对 Java 程序意味着什么?它是否使执行速度更快?或者是否有不是 JIT 的字节码?

【问题讨论】:

【参考方案1】:

有两种方法可以禁用 JIT

-Djava.compiler=NONE 

或者这几乎不会编译任何东西

-XX:CompileThreshold=2000000000

或在 IBM JVM 上

-nojit

禁用 JIT 会大大降低您的代码速度,例如50 倍,但并非总是如此。如果您将大部分时间花在 IO 或 GUI 更新上,您可能会发现这没什么区别。

【讨论】:

我正在学习 java 并且对大多数东西有很多疑问.....谢谢您的回答。 :) 进一步我想知道当我们禁用 JIT 时会使用什么编译器? @CoDerus 禁用 JIT 意味着没有编译器。相反,代码仅在解释器模式下运行。 我有点惊讶这个古老的 java.compiler 属性仍然有效,尽管你不能真正使用它来指定实际的编译器实现,所以我调查了一下,发现 JDK-8227229 解释了一个历史的一部分,还揭示了一个令人惊讶的事实,即指定 -Xdebug 会使 -Djava.compiler=NONE 无效,因此使用 -Xint 一直是更可靠的选择。【参考方案2】:

来自doc,

-Xint

以仅解释模式运行应用程序。禁止编译为本机代码,所有字节码都由解释器执行。

java.compiler 系统属性在 Java 9 之前为 Compiler 类所知。在 Java 9 中,它被标记为 @Deprecated

【讨论】:

【参考方案3】:

对于 IBM,正确的选项是 -Xnojit 或 -Xint

【讨论】:

这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review 当我写下他的答案时,我不被允许发表评论。否则,我会的。【参考方案4】:

在 HotSpot VM 中,可以使用选项 -XX:-UseCompiler 禁用 JIT 编译,该选项跳过编译器线程初始化。

trueby default:

product(bool, UseCompiler, true,                                          
        "Use Just-In-Time compilation")   

【讨论】:

以上是关于有没有办法关闭 JIT 编译器,这样做会影响性能吗?的主要内容,如果未能解决你的问题,请参考以下文章

CLR加载程序集代码时,JIT编译器对性能的产生的影响

看了这篇JIT编译器,你也能说你会java性能优化了!

编译告警被关闭的参数

哪个 JIT 正在运行我的应用程序

更改打字稿目标会影响编译性能吗?

JIT编译器