我的应用程序在docker容器中运行,它使用scala并使用“OpenJDK 64位服务器VM(构建25.102-b14,混合模式)”,其Xmx设置为16GB,容器内存限制为24Gb,运行一段时间后容器被杀死的时间:
Last State: Terminated
Reason: OOMKilled
Exit Code: 137
然而,我在日志中找不到任何“java.lang.OutOfMemoryError: Java heap space”错误,甚至过去两周在所有 48 个节点中都没有找到一次。所以这不太可能是正常的堆 OOM。
dmesg 输出:
$ dmesg -l err,crit,alert,emerg
STDIN is not a terminal
[1647254.978515] Memory cgroup out of memory: Kill process 10924 (java) score 1652 or sacrifice child
[1647254.989138] Killed process 10924 (java) total-vm:34187148kB, anon-rss:24853120kB, file-rss:23904kB
[1655749.664871] Memory cgroup out of memory: Kill process 1969 (java) score 1652 or sacrifice child
[1655749.675513] Killed process 1969 (java) total-vm:35201940kB, anon-rss:24856624kB, file-rss:24120kB
[1655749.987605] Memory cgroup out of memory: Kill process 2799 (java) score 1656 or sacrifice child
然后,我在 JCMD 再次被终止之前多次运行 JCMD,数据如下所示:
本机内存跟踪:
总计:保留=25505339KB,已提交=25140947KB
- Java 堆(保留=16777216KB,提交=16777216KB)
(mmap:保留=16777216KB,提交=16777216KB)
类(保留=247996KB,提交=93500KB)
(课程#14539)
(malloc=2236KB#29794)
(mmap:保留=245760KB,提交=91264KB)
线程(保留=1013160KB,提交=1013160KB)
(线程#1902)
(堆栈:保留=1003956KB,提交=1003956KB)
(malloc=6240KB#9523)
(竞技场=2964KB #3803)
代码(保留=263255KB,提交=86131KB)
(malloc=13655KB#20964)
(mmap:保留=249600KB,提交=72476KB)
GC(保留=776174KB,提交=776174KB)
(malloc=120814KB#164310)
(mmap:保留=655360KB,提交=655360KB)
编译器(保留=812KB,提交=812KB)
(malloc=681KB #1823)
(竞技场=131KB #3)
内部(保留=6366260KB,提交=6366256KB)
(malloc=6366256KB#178778)
(mmap:保留=4KB,提交=0KB)
符号(保留=18391KB,提交=18391KB)
(malloc=16242KB #153138)
(竞技场=2150KB #1)
本机内存跟踪(保留=9002KB,提交=9002KB)
(malloc=186KB #2000)
(跟踪开销=8816KB)
Arena 块(保留=273KB,提交=273KB)
(malloc=273KB)
未知(保留=32800KB,提交=32KB)
(mmap:保留=32800KB,提交=32KB)
我注意到的一件事是这一部分:
内部(保留=6366260KB,提交=6366256KB)
它不断增长并导致总内存使用量超过 24GB 限制。
有人以前见过类似的问题吗?有人知道这里的内部存储器是什么吗?它在不释放内存的情况下不断增长的原因是什么?