我的应用程序在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:reserved = 16777216KB,committed = 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:reserved = 249600KB,committed = 72476KB)
GC(保留= 776174KB,已提交= 776174KB) (malloc = 120814KB#164310) (mmap:保留= 655360KB,已提交= 655360KB)
编译器(保留= 812KB,已提交= 812KB) (malloc = 681KB#1823) (竞技场= 131KB#3)
内部(保留= 6366260KB,已提交= 6366256KB) (malloc = 6366256KB#178778) (mmap:reserved = 4KB,committed = 0KB)
符号(保留= 18391KB,已提交= 18391KB) (malloc = 16242KB#153138) (竞技场= 2150KB#1)
本机内存跟踪(保留= 9002KB,已提交= 9002KB) (malloc = 186KB#2000) (跟踪开销= 8816KB)
Arena Chunk(保留= 273KB,承诺= 273KB) (malloc的= 273KB)
未知(保留= 32800KB,已提交= 32KB) (mmap:reserved = 32800KB,commit = 32KB)
我注意到的一件事是这一节: 内部(保留= 6366260KB,承诺= 6366256KB)
它不断增长并导致总内存使用量超过24GB限制。
以前有人见过类似的问题吗?任何人都知道这里的内存是什么,以及它在不释放内存的情况下不断增长的原因是什么?
答案 0 :(得分:1)
这不是你问题的答案,只是一种解决方法。
我在java版本" 1.8.0_45"上运行JRuby的docker容器中发现了同样的问题。解决方案是显式调用垃圾收集。我完全不知道,为什么这样可行,但GC内部Java内存恢复到8MB后。
答案 1 :(得分:1)
最近,我们的应用程序遇到了同样的问题。在本例中,我们使用netty,并且netty分配直接内存,当存在许多io连接时,java本机内存跟踪中的内部内存会增加。
最后,我们使用两个参数来限制本机内存。
-Dio.netty.maxDirectMemory=1073741824
-XX:MaxDirectMemorySize=1024m
答案 2 :(得分:0)
您是否配置了-XX:+DisableExplicitGC
?
如果是,请删除它。
如果配置了 no “ -XX:+DisableExplicitGC
”,那么通过JConsole触发完整的GC后情况如何