java - java JIT什么时候有错误的优化?

标签 java performance jit

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

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

相关文章:

jvm - 为什么 Math.sin() 委托(delegate)给 StrictMath.sin()?

java - Apache tomcat 还是 apache ant?

java - @OrderBy 导致java.lang.ClassCastException : antlr. CommonToken cannot be cast to antlr.Token

C++:在表达式和函数调用上使用 '.' 运算符

assembly - JIT 跳转 (x86_64)

linux-kernel - 如何解决加载eBPF文件对象时的 "R0 invalid mem access ' inv'”错误

for-loop - 是否有用于 jdk 1.6 或 1.7 的 Junit 测试类可用

java - 我是否需要为每个测试创建一个新的 MockMvc?

java - 就内存和性能而言,在 Java 中每秒打印格式化日期+时间的最有效方法是什么?

c# - 使用 Entity Framework 4.1 时如何调试/分析性能