【问题标题】:JVM Warmup QueriesJVM 预热查询
【发布时间】:2016-04-03 02:25:46
【问题描述】:

我是 Java 新手。我正在阅读有关 JVM 预热的内容,并了解它指的是 JVM 找到热点并 JIT 这些代码部分所花费的时间。

我还明白,我必须运行数百次测试才能做到这一点。

但我不明白的事情如下:

  1. 在我的 JVM 完全预热之前,我应该如何确定测试应该运行的次数?

  2. 这是否会将 JVM 更改为 JVM?我的意思是,如果我能够通过运行 1000 次迭代来预热我的 JVM,那么其他人最终可能需要更多或更少吗?

  3. 运行测试是预热 JVM 的唯一方法吗?

  4. 我应该何时预热 JVM?我是说频率。我应该在每次停止和启动应用程序时执行此操作,还是在重新启动服务器后执行一次?

这是我在这里的第一个问题。我在发布之前阅读了指南。如果有任何错误,请提出修改建议。

【问题讨论】:

  • 您说的是哪种应用程序?为什么你认为你需要热身?运行测试将预热运行测试的 JVM。不是为您的应用程序提供服务的 JVM。
  • 你在做任何类型的基准测试吗?
  • @SMA 是的,我们正在研究一种算法来丰富每秒收到的大量交易。
  • @JBNizet 从我读到的关于 JVM 预热的内容看来,如果我的交易量很大,那么如果我的 JVM 已经预热,则所需的时间会更少。我仍然理解这些概念。我应该如何预热为我的应用程序服务的 JVM?
  • 您很可能正在预优化。只需启动您的 JVM,让它处理第一个真正的请求并识别热点:它很可能会足够快。如果您确实收到大量请求,它会自行迅速升温。无论如何,大多数在线应用程序都不受 CPU 限制,而是受 IO 限制。因此,如果一个方法在未预热时多花费 0.5 毫秒的时间,但无论如何在 IO 中花费了 200 毫秒,那么差异将可以忽略不计。

标签: java jvm


【解决方案1】:

在我的 JVM 完全预热之前,我应该如何确定测试应该运行的次数?

假设你有默认的-XX:CompileThreshold=10000,一个方法可以在 10,000 次调用后被触发编译,或者你有一个循环,它已经迭代了 10,000 次。这会在后台排队等待编译,因此在运行优化代码之前可能需要 12K - 20K 次迭代。

注意:JIT 可以重新优化代码,即使在 10K 或 100 万次迭代之后,您也可能会看到时序变化。

这会将 JVM 更改为 JVM 吗?我的意思是,如果我能够通过运行 1000 次迭代来预热我的 JVM,那么其他人最终可能需要更多或更少吗?

是的。如果您做的比您认为需要的多,这是涵盖更多配置的最佳方式。

运行测试是预热 JVM 的唯一方法吗?

您应该真正理想地运行真实代码。运行测试可以更好地减少预热代码的影响,因此在生产中更实用。

我应该何时预热 JVM?我是说频率。我应该在每次停止和启动我的应用程序时执行此操作,还是只在重新启动服务器后执行一次?

无论何时启动 JVM,都是从头开始。即使同一个 JVM 已经在运行,或者您从另一个生成了一个。

【讨论】:

  • 在分布式系统(可自动扩展)上显式预热应用程序以确保编译方法是否仍然有意义?
  • @TheLostMind 是否分布式,是否需要手动预热代码取决于预热前的性能是否可以接受,以及是否可以在应用程序使用前预热,即服务启动时间是否长在使用之前。恕我直言,您很少关心它,它真正有帮助的一个领域是低延迟交易系统,因为在您以最佳速度执行之前,10,000 个订单需要等待很多订单。尤其是如果这些订单每个数百万,并且您定期重新启动服务器。
  • @TheLostMind 您不想接受每天或每周的前 100 亿笔订单,您不会获得最佳速度/价格。一个缓慢的订单可能会花费您 0.002 % 的名义成本,这听起来并不多,但可能是每周 20,000 美元。
  • @TheLostMind 提供实例在您需要之前加载,例如即使在 10 秒或 1 分钟之前,您也可以花时间预热代码,或者至少做一些基本的正确性测试。最大的打击是第一次加载一个类,所以只需点击一次代码就足够了。
  • 顺便说一句,热身不仅仅是关于 JIT 编译。我会说在大型服务器应用程序中它根本与 JIT 无关。确定预热阶段结束的唯一方法是观察应用程序特定的性能指标达到稳定状态。
【解决方案2】:

首先,您不必担心在生产环境中预热/强制编译方法,因为让我们面对现实吧 - JIT 比我们更聪明:P.

我应该如何确定在我之前测试应该运行的次数 JVM 完全预热了吗?

在 Mac 上的 Java 8 上,一个方法需要大约 256 次迭代才能被 JIT 编译(假设该方法能够被 JIT 编译)。这个数字可能因一个 JVM 而异。

这会将 JVM 更改为 JVM 吗?我的意思是,如果我能够 通过运行 1000 次迭代来预热我的 JVM,然后其他人可能会结束 需要更多还是更少?

可能从 JVM 更改为 JVM。假设这个数字对于不同的 JVM 保持不变是不安全的。

运行测试是预热 JVM 的唯一方法吗?

好吧,如果您想对某些东西进行基准测试,那么可以。您应该让 JVM 优化它可以做的事情(通过使用预热运行),然后测量性能。

我应该何时预热 JVM?我是说频率。我应该这样做吗 每次我停止和启动我的应用程序时,或者只是一次之后 重新启动我的服务器?

每次您想要进行基准测试时(即在 JVM/应用程序启动时)。我认为没有理由在生产环境中这样做。请注意,在某些情况下,如果 JIT 发现其假设存在缺陷,它实际上可能更喜欢解释方法而不是编译方法。

【讨论】:

  • 我想投票给你的答案,但它不允许我。
  • @ThLostMind 感谢您的回复。我将安装 JitWatch。 :)
  • @MissMeme - 同时检查this阈值可以动态调整
  • 我很确定 -XX:CompileThreshold=10000 即使在 Mac 上。
【解决方案3】:

在我的 JVM 完全预热之前,我应该如何确定测试应该运行的次数?

  • 测量您的应用逻辑的延迟和吞吐量,并查看它何时趋于平稳
  • 使用-XX:+PrintCompilation 跟踪 JIT 行为

每个应用程序都不同,因此最好收集自己的数据。然后,您可以根据这些数据做出进一步的决定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多