【发布时间】:2022-11-11 14:33:25
【问题描述】:
最近,我将 Docker 映像从 opendjk:11-jre 升级到了 eclipse-temurin:17-jre,自从执行了更改后,我才意识到堆内存消耗显着增加(在某些情况下从 60MiB 到 140MiB)。我想知道,这是启动映像时标志中的内存泄漏还是配置错误?
另外,我注意到 GC 发生的次数比以前少了。
在 Java 11 中,我启用了这些选项,以便统一内存消耗,并且没有识别出由于 OOM 导致的重新启动:-XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled,但现在这些选项早已不复存在,无法在 Java 17 中使用。
是否有明确的原因导致 OOM 导致内存消耗增加和重启?我错过了 Java 17 中的一些标志吗?
【问题讨论】:
-
一些垃圾收集器需要比其他垃圾收集器更多的内存来进行自己的记账(也就是说,BTW,而不是 Java 堆内存)。您现在可能正在使用 G1GC,它需要比您之前使用的 CMS-GC 更多的内存。此外,每个 GC 都有自己的内存行为(例如,有些可能只在真正需要时才分配内存,而另一些则更倾向于慷慨地消耗内存以降低 GC 的 CPU 成本等)
-
感谢您回复@MarkRotteveel,刚刚使用以下命令进行了快速测试,看看它会使用 pod 规格
docker run --cpus=0.5 --memory=256Mi --rm -it eclipse-temurin:17-jre java -Xlog:gc\* -version选择哪个 GC,输出为[0.005s][info][gc] Using Serial