为什么java本机内存跟踪中的内存增加

我的应用程序运行在Docker容器中,它使用Scala并使用“OpenJDK 64位服务器VM(build 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,承诺= 16777216KB)

  • 类(保留= 247996KB,承诺= 93500KB)(类#14539)(malloc = 2236KB#29794)(mmap:reserved = 245760KB,承诺= 91264KB)

  • 线程(保留= 1013160KB,承诺= 1013160KB)(线程#1902)(stack:reserved = 1003956KB,承诺= 1003956KB)(malloc = 6240KB#9523)(竞技场= 2964KB#3803)

  • 代码(保留= 263255KB,承诺= 86131KB)(malloc = 13655KB#20964)(mmap:reserved = 249600KB,承诺= 72476KB)

  • GC(保留= 776174KB,承诺= 776174KB)(malloc = 120814KB#164310)(mmap:reserved = 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)

  • 竞技场块(保留= 273KB,承诺= 273KB)(malloc = 273KB)

  • 未知(保留= 32800KB,提交= 32KB)(mmap:保留= 32800KB,提交= 32KB)

我注意到的一件事是这个部分:内部(保留= 6366260KB,承诺= 6366256KB)

它不断增长,导致总内存使用超过24GB的限制。

任何人都见过类似的问题? 任何人都知道这里是什么内在的记忆,这可能是什么原因,它不断释放内存不断增长?

这不是你的问题的答案,这只是一个解决方法。

在java版本“1.8.0_45”上运行JRuby的Docker容器中,我观察到了同样的问题。 解决scheme是显式调用垃圾收集。 我完全不知道,为什么这个工作,但GC内部Java内存后返回到8MB。