如何禁用特定方法/类的Java JIT编译器优化?

9

我在我的Java应用程序中遇到了一个问题,即JIT会破坏代码。如果我禁用JIT,则一切正常,但运行速度会变慢10-20倍。

是否有办法针对特定的方法或类禁用JIT?

编辑: 我正在使用Ubuntu 10.10,在以下两个版本中获得相同的结果:

OpenJDK Runtime Environment (IcedTea6 1.9) (6b20-1.9-0ubuntu1)
OpenJDK 64-Bit Server VM (build 17.0-b16, mixed mode)

并且:

Java(TM) SE Runtime Environment (build 1.6.0_16-b01)
Java HotSpot(TM) 64-Bit Server VM (build 14.2-b01, mixed mode)

你已经提交了一个错误报告吗?或者你找到了一个现有的错误报告,它描述了你的问题? - soc
听起来很不可能是JIT的问题,是吧?难道它不可能是由于竞态条件导致的(因为在禁用JIT时时间会改变)... - aioobe
我只使用了一个线程。我正在忙于查找错误,但现在真的没有时间。该错误在JIT编译了特定方法后一直出现。目前,我只是将-XX:CompileThreshold选项设置得足够高。 - Ralf
你尝试过更高版本的JDK吗? - Romain Hippeau
2
指责JVM通常应该排在列表的相当底部 :) - bwawok
现在我先禁用特定方法的JIT,让问题暂时消失。等有时间了再去找责任所在。 - Ralf
2个回答

9
以下选项适用于我的JVM,用于排除特定方法:
-X:CompileCommand=exclude,the/package/and/Class,methodName

2
Sun/Oracle Java 6及以上版本使用-XX:CompileCommand选项。有关更多信息,请参见java选项,特别是针对v8的部分。 - Alexey Ivanov
1
抱歉挖出这么老的帖子;如果我要在命名的内部类中使用它,我应该将其限定为 com/domain/package/Outer/Inner 还是 com/domain/package/Outer$Inner - nanofarad
我今天遇到了同样的问题。经过一些尝试,似乎我们应该使用 com/domain/package/Outer$Inner - TsReaper

6

是的,有一种方法。 您可以在启动时提供要排除JIT编译的受影响类:

-Xjit:exclude={package/class.method|package/class.method}

2
我收到了"无法识别的选项:-Xjit:exclude={...} 无法创建 Java 虚拟机。" - Ralf
2
-X选项是非标准的。它们可能会在不同版本之间发生变化,并且取决于您的JVM。 - robert_x44

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