我的应用程序在docker容器中运行,它使用
scala并使用“OpenJDK 64位服务器VM(内置25.102-b14,混合模式)”,其Xmx设置为16GB,容器内存限制为24Gb,运行后为某些容器被杀的时间:
Last State: Terminated
Reason: OOMKilled
Exit Code: 137
但是我在日志中找不到任何“java.lang.OutOfMemoryError:Java堆空间”错误,在所有48个节点中都没有找到过去2周内的错误.所以它不太可能是正常的堆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,然后再次被杀死,数据如下所示:
本机内存跟踪:
总计:保留= 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 Chunk(保留= 273KB,承诺= 273KB)
(malloc的= 273KB)
>未知(保留= 32800KB,已提交= 32KB)
(mmap:保留= 32800KB,已提交= 32KB)
我注意到的一件事是这一节:
内部(保留= 6366260KB,承诺= 6366256KB)
它不断增长并导致总内存使用量超过24GB.
以前有人见过类似的问题吗?任何人都知道这里的内存是什么,以及它在不释放内存的情况下不断增长的原因是什么?
最佳答案 这不是你的问题的答案,它只是一个解决方法.
我在java版“1.8.0_45”上运行JRuby的docker容器中发现了同样的问题.解决方案是显式调用垃圾收集.我完全不知道,为什么这样可行,但GC内部Java内存恢复到8MB后.