【发布时间】:2019-10-31 21:39:17
【问题描述】:
最初的问题是 java 应用程序是 docker 由于内存使用而被 OOM 杀死。 所以我开始使用 NMT 来了解为什么消耗量超过预期。 JVM 版本为 1.8.0_212,支持容器。 docker 使用下一个 java 选项启动
JAVA_OPTS='-XX:+AlwaysPreTouch -Xmx128m -Xms128m -XX:MaxMetaspaceSize=150m -XX:ReservedCodeCacheSize=100m -XX:+UseStringDeduplication -XX:+PrintFlagsFinal -XshowSettings:vm -XX:NativeMemoryTracking=detail' ... -m="450m" --cpu-shares="256" docker-image
本机内存跟踪:
Total: reserved=1464054KB +843KB, committed=344578KB +1359KB
...
- Class (reserved=1124594KB +19KB, committed=85066KB +275KB)
(classes #15631)
(malloc=2290KB +19KB #20081 +27)
(mmap: reserved=1122304KB, committed=82776KB +256KB)
...
所有数字都符合预期。唯一的问题是 Class 字段,因为它显示了 ~ 1GB 的保留值,它可以以某种方式减少吗?
【问题讨论】:
-
为什么?你的问题是提供足够的内存,而不是减少任何东西。
-
你真的用了 15691 个类,它们就在那里。
-
1gd 保留,对于我的小型微服务来说似乎太多了,它什么都不做:) 似乎由于某些逻辑(可能是因为 aop-spring)它不断生成新类。而且因为限制是1gb,所以会更新GC
-
通过-XX:+UseSerialGC参数更改默认GC算法(Parallel GC)可以看到最大的变化。
标签: java docker memory-management jvm