JVM/代码调整以减少 JVM 挂起时间

JVM / code tuning to reduce JVM suspension time

我们正在对 Web 服务应用程序进行负载测试,其中一项建议是尝试减少暂停时间以缩短响应时间。

根据我的研究,减少挂起时间的最佳方法是最小化对象的生命周期,但关于该主题的信息非常稀少。所以我想知道两件事:

  1. 减少暂停时间会减少响应时间的假设是否正确?
  2. 除了正确快速地处理对象之外,还有其他方法可以减少暂停时间吗?

我们当前的相关 JVM 选项是:

-XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:NewRatio=2 -XX:+UseTLAB -XX:SurvivorRatio=2 -Dsun.reflect.noInflation=false -Dsun.reflect.inflationThreshold=21474836 -Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize=true -XX:MaxMetaspaceSize=256m -Xms3072m -Xmx3072m -XX:+CMSClassUnloadingEnabled

谢谢

您不应该编写旨在缩短对象生命周期的代码,您只需要编写设计良好的代码即可。也就是说,我建议尽可能使用享元模式。

当您在完全 GC 暂停期间有请求时,减少挂起时间将大大减少响应时间。 (GC 暂停会增加通常的响应时间,因为应用程序将停止直到 GC 完成)

您可以专注于调整 JVM,更精确地设置堆大小选项(检查 Java HotSpot VM Options)。 GC 及其选项可能会根据您的 JDK 版本而变化。

要提高响应时间的一致性,您需要减少暂停的原因。这可能是 GC,等待网络资源,使用锁导致可伸缩性差或多次暂停。

如果您的响应时间延迟的主要原因是 GC 暂停,那么减少 GC 暂停时间的次数和长度将改善响应时间。 esp 响应时间一致性。

如果您正在尝试减少典型的响应时间,但您并没有在每个请求上都获得 GC,您很可能希望调整您的软件以减少工作量、分配较少的对象、使用较低时间复杂度的算法,避免在每次请求时访问网络和 IO。