Java JVM预热查询

Java JVM预热查询,java,jvm,Java,Jvm,我是Java新手。我阅读了有关JVM预热的文章,了解到它指的是JVM找到热点和JIT这些代码部分所需的时间 我也明白,为了做到这一点,我必须运行几百次测试 但我不明白的是: 在JVM完全预热之前,我应该如何确定测试应该运行的次数 这是否会将JVM更改为JVM?我的意思是,如果我能够通过运行1000次迭代来预热我的JVM,那么其他人可能最终需要更多或更少 运行测试是预热JVM的唯一方法吗 我应该什么时候预热JVM?我指的是频率。我应该在每次停止和启动应用程序时这样做,还是在重新启动服务器后这样做

我是Java新手。我阅读了有关JVM预热的文章,了解到它指的是JVM找到热点和JIT这些代码部分所需的时间

我也明白,为了做到这一点,我必须运行几百次测试

但我不明白的是:

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

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

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

  • 我应该什么时候预热JVM?我指的是频率。我应该在每次停止和启动应用程序时这样做,还是在重新启动服务器后这样做


  • 这是我的第一个问题。我在发布前阅读了指南。不过,如果有任何错误,请建议进行编辑。

    首先,您不应该担心在生产环境中预热/强制编译方法,因为让我们面对它-JIT比我们更聪明:p

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

    在mac上的Java8上,JIT编译一个方法大约需要256次迭代(假设该方法能够进行JIT编译)。这个数字可能因JVM而异

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

    这可能会随着JVM的变化而变化。假设不同JVM的这个数字保持不变是不安全的

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

    好吧,如果你正在尝试对某个东西进行基准测试,那么是的。您应该让JVM尽可能地优化(通过使用预热运行),然后测量性能

    我应该什么时候预热JVM?我指的是频率。我应该这样做吗 每次我停止并启动应用程序时,或仅在之后一次 重新启动我的服务器

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

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

    假设您有默认的
    -XX:CompileThreshold=10000
    方法,则可以在10000次调用后触发该方法进行编译,或者在其中有一个循环已迭代10000次。这是在后台排队编译的,所以在运行优化代码之前可能需要12K-20K次迭代

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

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

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

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

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

    我应该什么时候预热JVM?我指的是频率。我应该在每次停止和启动应用程序时这样做,还是在重新启动服务器后这样做

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

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

    • 测量应用程序逻辑的延迟和吞吐量,并查看其何时达到平衡
    • 使用
      -XX:+printcomilation

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

    您在谈论什么样的应用程序?你为什么认为你需要热身?运行测试将预热运行测试的JVM。不是为您的应用程序服务的JVM。您是否正在进行任何类型的基准测试?@SMA是的,我们正在研究一种算法,以丰富每秒收到的大量交易。@jbnize从我读到的有关JVM热身的内容来看,如果我得到大量交易,那么如果我的JVM已经热身,那么所需的时间就会更少。我仍然理解这些概念。我应该如何预热服务于我的应用程序的JVM?您很可能正在进行预优化。只需启动JVM,让它处理第一个真正的请求并确定热点:它很可能足够快。如果你确实收到了大量的请求,它会自动迅速升温。大多数在线应用程序都不是CPU绑定的,而是IO绑定的。因此,如果一个方法在未预热时多花费0.5毫秒的时间,但在IO中却花费了200毫秒,那么差异将可以忽略不计。我想投票给你的答案,但它不允许我。@MissMeme-没问题Madamji:)。。您应该安装以查看JIT正在编译什么,以及运行多少次等etc@ThLostMind谢谢你的回复。我将安装JitWatch.:)@MissMeme-也可以检查。阈值可以动态调整我很确定,即使在mac电脑上,
    -XX:CompileThreshold=10000
    。在分布式系统(可自动伸缩)上,显式预热应用程序以确保方法被编译是否仍然有意义?@lostmind distributed,是否需要手动预热代码取决于预热前的性能是否可接受,以及是否可以在使用前预热应用程序,即服务是否在使用前很久启动。这是公平的