为什么java Native Memory Tracking中的内部内存增加

2024-06-28

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

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


最近我们的应用程序遇到了同样的问题。在我们的例子中,我们使用netty,并且netty分配直接内存,当存在许多io连接时,java Native Memory Tracking中的内部内存不断增加。
最后我们使用两个参数来限制本机内存。

-Dio.netty.maxDirectMemory=1073741824
-XX:MaxDirectMemorySize=1024m
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么java Native Memory Tracking中的内部内存增加 的相关文章

随机推荐