我们有一个在 Open Shift 中运行的 Spring Boot 应用程序,其中 pod 内存约为 3 GB 到 4 GB。
最近 Spring Boot 项目中添加了一个新进程,内存使用量现在约为 8 GB,有时会达到 13 GB。
我使用 ../actuator/heapdump 下载了一个 heapdump 文件,它(手动)执行了 gc,并清除了内存中的垃圾,使其大小约为 3 GB。
我在 VisualVM 中打开堆转储,我注意到有很多按降序排列的支配者,如类加载器、哈希图、对象映射器等。
用Java编写哈希图的正确方法是什么? ...!! 如何配置 gc 以使其满足所有未使用/未链接的对象?
谢谢。
我不熟悉你所使用的具体流程和架构,所以我不会对此发表评论。然而,我在我们的一个应用程序中遇到了类似的问题。
从执行器/堆转储端点下载堆转储时,我注意到内存显着减少。结论是垃圾收集器没有足够的时间来清除未使用的对象。
作为解决方案,我添加了以下 JVM 参数,问题得到了解决。从那以后我就没有遇到任何堆转储问题。我建议使用这些参数:
XX:InitiatingHeapOccupancyPercent=60 -XX:MaxGCPauseMillis=10000 -Xms2G -Xmx4G
您可以参考此链接了解更多信息。