这段时间检测到内存耗尽的早期症状 window

Early symptoms of memory exhaustion have been detected in this time window

我很难理解新遗物抛出的以下 error/warning:

Early symptoms of memory exhaustion have been detected in this time window.

以下是基于日志的配置文件图表。

我想了解:

  1. 为什么 Eden Space 在次要 GC 发生时永远不会完全清理?
  2. 根据日志中的 GC 行为,蓝色和黄色是否分别对应于主要 GC 和次要 GC?
  3. 为什么 GC 一直在回收?
  4. 红色区域是 New Relic 抛出内存耗尽警报时。但是,堆还没有满。这会触发断路器过渡到打开状态吗?

我在向我们的任务执行器服务提交新的 REST 调用时注意到了这种行为(例如:executorService.submit(() -> restconecto.post(..)))。我尝试提交一个 logger.info() 并且它工作正常,但似乎做一个长轮询是问题所在。下面是我的 GC 配置:

感谢您的任何见解。

  1. 垃圾收集器是一个守护线程,在 JVM 启动时启动,在所有非守护线程停止时守护进程停止。 GC 不断 运行 并且应用程序永远不干净的原因很可能是因为总有一些东西需要收集(甚至可能是后台任务)。最终用户无法控制垃圾收集器。

  2. 不太明白你的问题

  3. 见1.

  4. 您的堆不一定要满才能触发警报。默认遗物设置如下:

    Memory threshold: 20%
    Garbage collection CPU threshold: 10%
    

当然可以调整这些,但这些基本上意味着如果可用内存小于阈值,则会触发警报。

正如您在提交 REST 请求时注意到的(取决于实际提交的请求以及您的应用程序的情况 structured/designed),此特定请求可能 'heavy' 供应用程序处理,因此它可能会使用比您预期更多的内存。

  1. 您使用的年轻代收集器是PS Scavenge。该收集器并行使用多个线程。因此,没有一个完整的 stop-the-world 暂停来收集年轻一代的所有节点。因此,Eden space.
  2. 的可用 space 不太可能一直下降到 0%
  3. 图表上的黄线和蓝线不对应主要或次要 GC 事件。这取决于图表本身。然而,在 Garbage Collection CPU Time 图表中,黄色区域对应于年轻代收集器 CPU 花费的时间, PS Scavenge,而蓝色区域对应于 CPU 花费在老年代收集器上的时间,PS Mark Sweep.
  4. 垃圾收集器一直处于 运行,因为年轻一代、幸存者一代和老一代收集器都在使用多个后台线程。这最大限度地减少了单线程垃圾收集器中定期发生的 stop-the-world 暂停次数。
  5. 根据我从图表中可以看出的情况,是的。红色区域是 New Relic 确定它需要暂停程序并完全清理堆以便程序可以继续运行的时间段 运行。通常,并发收集器最终只会延迟 stop-the-world 暂停,而不是完全阻止它们。参见 Gil Tene's seminal talk on Garbage Collection for details. For details on the conditions under which the circuit breaker trips, see this doc