JIT 在 10k 次调用后进行方法优化 (-XX:+PrintCompilation),您可以使用 -XX:CompileThreshold 对其进行配置。我读到不降低该阈值的原因是 JIT 优化可能是错误的,或者您优化了不常用的代码。我有几个关于这方面的问题:
- 我认为错误的优化(即:栈上替换)是由于多态方法的惰性类加载造成的。但是在找到 3 个实现(我认为)之后,JVM 只是进行索引表查找。当然,如果你有更多的多态实现,速度会受到影响。多态方法是错误的 JIT 优化的唯一原因还是主要原因?如果不是,其他的是什么?
- 如果我可以在启动时强制加载所有类,以便 JVM 可以预先构建此类索引表,那么预先进行整体优化不是更好吗?优化所有方法有什么问题?如果我的目标只是速度,成本是多少?
- 与 C++ 相比,如果我的源代码是封闭的,这意味着没有第 3 方库,就像那个低延迟系统一样,是否有一种方法可以强制预先优化以提高性能以接近 C++ 的性能?
- Peter Lawrey 在他的 Oracle 杂志文章中提到,您可以通过在生产中人为地运行足够的测试数据以满足阈值来启动 JIT。这样做在生产环境中似乎很危险,一旦发生事故你就会被解雇。必须有更好的方法来以最小的风险做到这一点。
- 非常感谢关于此主题(涉及 java 和 c++)的任何好的引用。
更新:#3。永远不要期望 java 比 c++ 更快,只是希望更接近。
最佳答案
is there a way to force optimization upfront to increase performance to be better than that of c++?
没有。这是 Java 规范中强制执行的语义和 JVM 生态系统工作方式的一个基本限制,它会比 C++ 实现慢,假设实现和代码的质量相同。看看my existing answer on this subject了解更多详情。
关于java - java JIT什么时候有错误的优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10885451/