【发布时间】: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