4

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

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

更新:#3。永远不要期望 java 比 c++ 快,只是想更接近。

4

1 回答 1

2

有没有办法强制预先优化以提高性能以优于 c++?

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

于 2012-06-04T17:32:16.297 回答