如何禁用JIT编译器的内在函数用法?

Bio*_*441 7 java jit jvm

我正在做一些性能测试JVM,我想测量内在函数使用的影响.

我想在JIT不进入解释模式的情况下禁用某些方法使用内在函数.有没有办法做到这一点 ?谢谢

Tag*_*eev 8

使用

java -XX:+UnlockDiagnosticVMOptions -XX:DisableIntrinsic=_<method_name>[,...]
Run Code Online (Sandbox Code Playgroud)

例如

java -XX:+UnlockDiagnosticVMOptions -XX:DisableIntrinsic=_equals,_hashCode
Run Code Online (Sandbox Code Playgroud)

正如@apangin注意到的那样,您可以-XX:+PrintIntrinsics先使用它来查看哪些方法在您的测试中实际内在并且禁用它们.

  • 哦,我认为有一个简单的解决方案:首先使用`-XX:+ PrintIntrinsics`来打印所有编译的内在函数,然后使用`-XX:DisableIntrinsic =`来禁用它们. (4认同)
  • 顺便说一下,我创建了一个[所有JVM内在函数表](https://gist.github.com/anonymous/1e9f4cab9f659982df82) (4认同)
  • 构建自定义HotSpot可能更容易,其中`Compile :: make_vm_intrinsic`总是返回NULL以立即禁用所有内在函数. (3认同)
  • 那是 JDK 7u80 内在函数。现在 [JDK 8u45 内在函数](https://gist.github.com/apangin/7a9b7062a4bd0cd41fcc)。 (2认同)
  • @ Bionix1441不幸的是JVM没有这样的切换.因此,您必须逐个修补JVM或禁用它们. (2认同)