【问题标题】:Is it possible to enable caching of native code?是否可以启用本机代码的缓存?
【发布时间】:2020-09-29 22:47:12
【问题描述】:

有什么方法可以让 JVM 将其生成的优化后的原生代码缓存到文件中,以提高未来运行的性能?

【问题讨论】:

  • 您可能正在寻找 GraalVM。
  • GraalVM 有这个选项吗?我知道native-image 可以编译为本机代码,但是我必须为每个平台编译我的应用程序。我正在寻找的是一个简单的标志,它告诉 JVM 缓存 JIT 的代码以供将来运行。
  • 它不以那种特定的形式存在;这是 Graal 旨在提供的功能。

标签: java performance caching jvm-hotspot jvm-arguments


【解决方案1】:

从 JDK 9 开始提供提前 (AOT) 编译。请参阅 JEP 295
注意:这与 GraalVM Native Image 不同

由于多种原因,缓存 JIT 编译代码存在问题。

  • HotSpot 编译器严重依赖推测优化。这些优化基于某些运行时条件,这些条件在每次运行时可能并不总是相同。

  • JIT 编译的代码可能引用特定的对象和类,它可能依赖于仅在运行时才知道值的常量,它可能具有直接内联到指令流中的内存地址。这使得缓存的代码无法直接重用。该问题可以通过额外的间接级别来解决,这会影响性能。

这就是为什么一些 JVM 供应商采用了另一种方法:缓存 运行时配置文件数据,而不是最终代码。然后可以使用从上次运行收集的配置文件数据尽快(一旦满足所有先决条件)重新编译最热门的方法,而无需在解释器中运行方法来再次收集配置文件。

至少有两种已知的解决方案:

Zing 虚拟机还具有Compile Stashing 技术,可以重用已编译的代码本身。它可以与 ReadyNow! 一起使用。

有一个JEP draft 在 OpenJDK 中添加 JWarmup 支持。

这是一个nice blog post,关于 HotSpot 中的 AOT 编译、JIT 缓存和相关技术。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-05
    • 2011-09-24
    • 1970-01-01
    • 2013-04-30
    • 2020-07-20
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    相关资源
    最近更新 更多