Java JIT 什么时候有错误的优化



JIT 在 10k 次调用后进行方法优化 (-XX:+PrintCompilation),您可以使用 -XX:CompileThreshold 对其进行配置。我读到不降低该阈值的原因是 JIT 优化可能是错误的,或者您优化了不常用的代码。我对此领域有几个问题:

  1. 我认为错误的优化(即:堆栈替换)是由于多态方法的懒惰类加载。但是在找到 3 个实现(我认为)后,JVM 只需执行索引表查找。当然,如果你有更多的多态 impl,速度就会受到影响。多态方法是导致 JIT 优化错误的唯一原因还是主要原因?如果不是,其他的是什么?
  2. 如果我可以在启动时强制加载所有类,以便 JVM 可以预先构建这样的索引表,那么预先进行整体优化不是更好吗?全优化方法有什么问题?如果我的目标只是速度,代价是什么?
  3. 与C++相比,如果我的源代码是关闭的,这意味着没有第三方库,就像那个低延迟系统一样,有没有办法强制提前优化以提高性能以更接近 C++ 的性能?
  4. Peter Lawrey 在他的 oracle 杂志文章中提到,您可以通过在生产中人为地运行足够的测试数据来满足阈值来启动 JIT。这样做在生产环境中似乎很危险,一次事故你就会被解雇。必须有更好的方法来以最小的风险做到这一点。
  5. 任何关于这个主题的好参考(涉及Java和C ++)都非常感谢。

更新: #3. 永远不应该期望Java比C ++更快,只是想更接近。

有没有办法预先强制优化以提高性能 比 C++ 更好?

不。这是Java规范中强制执行的语义和JVM生态系统工作方式的基本限制,假设实现和代码的质量相同,它将比C++实现慢。查看我关于此主题的现有答案以获取更多详细信息。

最新更新