-1

我们有 10 个 Spring Boot 应用程序在 ubuntu18 上运行,具有 8GB RAM 和 Java 11。

我们使用 java 垃圾收集器-XX:+UseSerialGC运行应用程序,而不限制堆空间。

但是几天后服务器内存完全耗尽并且服务器被挂起。

如果我们使用垃圾收集器,我们是否需要限制堆内存?

我也尝试过使用其他垃圾收集器,但除了 +UseSerialGC 没有任何效果。

4

2 回答 2

1

UseSerialGC 是“ok-ish”(不好!)但会阻塞。至少使用并行的。检查https://www.baeldung.com/jvm-garbage-collectors了解差异。

也就是说,如果您有真正的内存泄漏,那么不同的垃圾收集器不会对您有太大帮助。您可能应该分析您的应用程序以查看 GC 没有回收哪些对象实例。

查看这篇文章以了解 Spring Boot: https ://medium.com/illegalarguments/how-to-find-memory-leaks-in-spring-boot-592faf11d571

于 2020-04-14T14:24:38.627 回答
0

如果你正在耗尽堆,那么你正在耗尽堆。您选择的垃圾收集器对您没有帮助。

当你用尽你的堆时,任何垃圾收集器*都会尝试尽可能多地清理,所以如果 SerialGC 无法腾出一些空间,那么其他垃圾收集器也不能这样做。

你大概有内存泄漏。进行堆转储并查看占用最多空间的内容。从低垂的果实开始——那些消耗最多空间的果实。也许你有你添加的集合并且永远不会从中删除。(对于我的项目,Map通常是最常见的罪魁祸首)。

如果可能,请考虑定期重新启动服务器以完全清除所有内容。


*好吧,不完全

于 2020-04-14T14:34:52.427 回答