gpt4 book ai didi

Java 垃圾收集器时间限制

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:09:01 26 4
gpt4 key购买 nike

情况

我正在为一个 Java 竞赛开发一个客户端,每当我收到一个请求时,我有两秒钟的时间来响应。响应后到下一个请求的时间未知。

有时,找到正确的响应需要将近 2 秒,有时只需几毫秒。问题是当垃圾收集发生在一个较长的计算(也分配了很多对象)中,就在两秒快结束时,因此响应发送得太晚,我被取消资格。

使用详细的 gc 输出,我确定 gc 通常需要大约 0.6 秒,即使我试图将其限制得更低。我还尝试在较短的计算中调用 System.gc()(因为我确定我有大约 1.8 秒的时间不需要做任何事情),但它需要 1-3 秒,这也不安全。

我的程序中只有很少的长生命周期对象,大多数都短于一秒。

规范

我知道该程序将始终在具有这些可用资源的同一台机器上运行:

我当前的 jvm 参数:

java -Dfile.encoding=UTF-8 \
-XX:MaxGCPauseMillis=200 \
-XX:GCPauseIntervalMillis=2050 \
-XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled \
-XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 \
-XX:+ScavengeBeforeFullGC -XX:+CMSScavengeBeforeRemark \
-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps

想法

  • 我能以某种方式告诉 gc 它现在应该收集一些垃圾,但只持续大约 1.5 秒吗?
  • 是否有只适用于年轻对象而不检查老一代的 System.gc() 等价物?
  • 能否优化jvm参数以获得更好的效果?

最佳答案

以下是您可以尝试减少停顿的方法:

  • 尝试使用 G1 收集器代替 CMS
  • 使用更现实的 GC 目标。当前的目标允许每 2 秒有 200 毫秒的 stop-the-world GC 时间。增加 MaxGCPauseMillis 和/或减少 GCPauseIntervalMillis。
  • 添加另一个核心,以便 JVM 能够与您的应用程序并行进行 GC。
  • 减少 CMSInitiatingOccupancyFraction,以便 GC 在堆未满时触发后台 GC 线程。
  • 降低您的应用程序产生垃圾的速度。
  • 调整您的应用程序算法,以便有更多空闲时间用于后台 GC(在您的单核上)。

关于Java 垃圾收集器时间限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48989515/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com