我们有 10 个 Spring Boot 应用程序在 ubuntu18 上运行,具有 8GB RAM 和 Java 11。
我们使用 java 垃圾收集器-XX:+UseSerialGC运行应用程序,而不限制堆空间。
但是几天后服务器内存完全耗尽并且服务器被挂起。
如果我们使用垃圾收集器,我们是否需要限制堆内存?
我也尝试过使用其他垃圾收集器,但除了 +UseSerialGC 没有任何效果。
我们有 10 个 Spring Boot 应用程序在 ubuntu18 上运行,具有 8GB RAM 和 Java 11。
我们使用 java 垃圾收集器-XX:+UseSerialGC运行应用程序,而不限制堆空间。
但是几天后服务器内存完全耗尽并且服务器被挂起。
如果我们使用垃圾收集器,我们是否需要限制堆内存?
我也尝试过使用其他垃圾收集器,但除了 +UseSerialGC 没有任何效果。
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
如果你正在耗尽堆,那么你正在耗尽堆。您选择的垃圾收集器对您没有帮助。
当你用尽你的堆时,任何垃圾收集器*都会尝试尽可能多地清理,所以如果 SerialGC 无法腾出一些空间,那么其他垃圾收集器也不能这样做。
你大概有内存泄漏。进行堆转储并查看占用最多空间的内容。从低垂的果实开始——那些消耗最多空间的果实。也许你有你添加的集合并且永远不会从中删除。(对于我的项目,Map
通常是最常见的罪魁祸首)。
如果可能,请考虑定期重新启动服务器以完全清除所有内容。
*好吧,不完全