【问题标题】:java.lang.OutOfMemoryError: GC overhead limit exceeded during Jmeter load testingjava.lang.OutOfMemoryError:在 Jmeter 负载测试期间超出了 GC 开销限制
【发布时间】:2020-08-05 13:21:25
【问题描述】:

我正在对 Spring Boot 应用程序 (Java 8) 执行 Jmeter 负载测试,其中我触发了 50 个并发请求,分配的堆大小为 6GB。在测试过程中我遇到了

java.lang.OutOfMemoryError: 超出 GC 开销限制

根据 Java 文档,

默认情况下,JVM 配置为在 Java 进程将 98% 以上的时间花在 GC 上,而只有更少的时间 每次运行都回收了不到 2% 的堆。

出现此错误后,应用程序变得异常缓慢,这是预期的行为。我检查了可能的内存泄漏,但没有。我想知道垃圾收集器如何以及何时释放失败请求的占用内存?

例如如果我再次运行带有 20 个并发请求的测试套件,我的应用程序是否能够通过释放上一次运行的内存来处理这些请求,或者我是否需要重新启动应用程序?

添加一些应用细节:

  • 应用程序每次请求从表(有 30 列)中获取大约 50k-200k 行
  • 预计在测试期间会出现内存不足,以查找每个请求可以获取的行数

我担心的是,如果这个错误出现在生产环境中,我的应用程序会如何表现。它是否能够以相同的速度处理未来的请求,或者我必须重新启动我的应用程序?

【问题讨论】:

  • 这里的信息有限,要准确回答是非常复杂的。可能是您的应用程序加载了 pdf 并且它确实需要大量内存吗?可能是你的 GC 算法不适合?可能是你有内存泄漏?可能是你没有关闭一些资源?
  • @Eugene 添加了申请详情

标签: java spring-boot java-8 garbage-collection


【解决方案1】:

Java 不满意,因为高级别 GC 表明存在严重问题。然而,这可能是合理的,因为高水平的对象流失或复杂的循环关系使得 GC 花费更多时间来确定死对象。它也不能帮助您准确确定泄漏发生的位置(如果发生泄漏)。

当测试中出现这个错误时,我做的第一件事就是关闭这个错误。这可以通过-XX:-UseGCOverheadLimit JVM 标志来完成。这将允许 GC 继续,并更好地突出任何“真正的”内存问题。

【讨论】:

  • 应用程序没有内存问题,使用VisualVm分析。我担心的是如果这个错误出现在生产中,我的应用程序将如何表现。它能否以同样的速度处理未来的请求?
  • 绝对必须存在内存“问题”,否则您将不会收到此错误。 JVM 没有足够的内存来做它需要做的事情。尚不清楚这是泄漏还是内存不足。如果不是内存泄漏,应用程序最终应该会恢复。同时,一些请求可能会出错而无法满足。其他人可能处理得非常缓慢。如果是内存泄漏,则该内存将“丢失”,直到您重新启动。在生产环境中,应用程序的行为方式相同。
猜你喜欢
  • 2015-04-25
  • 2017-12-27
  • 2017-06-12
  • 1970-01-01
  • 2020-09-08
  • 2020-07-24
  • 1970-01-01
  • 2019-06-29
相关资源
最近更新 更多