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

时间:2016-09-12 19:54:28

标签: java docker memory-leaks out-of-memory kubernetes

我的应用程序在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限制。

以前有人见过类似的问题吗?任何人都知道这里的内存是什么,以及它在不释放内存的情况下不断增长的原因是什么?

3 个答案:

答案 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后情况如何