zhi*_*eng 5 java memory-leaks out-of-memory docker kubernetes
我的应用程序在docker容器中运行,它使用scala并使用“ OpenJDK 64位服务器VM(内部版本25.102-b14,混合模式)”,其Xmx设置为16GB,并且容器内存限制为24Gb(在运行了某些功能后)集装箱被杀死的时间:
Last State: Terminated
Reason: OOMKilled
Exit Code: 137
Run Code Online (Sandbox Code Playgroud)
但是,我在日志中找不到任何“ java.lang.OutOfMemoryError:Java堆空间”错误,即使在过去的两周内在所有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
Run Code Online (Sandbox Code Playgroud)
然后,我多次运行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)
代码(reserved = 263255KB,commit = 86131KB)(malloc = 13655KB#20964)(mmap:reserved = 249600KB,commit = 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)
符号(reserved = 18391KB,commit = 18391KB)(malloc = 16242KB#153138)(area = 2150KB#1)
本机内存跟踪(保留= 9002KB,已提交= 9002KB)(malloc = 186KB#2000)(跟踪开销= 8816KB)
Arena Chunk(预留= 273KB,已提交= 273KB)(malloc = 273KB)
未知(保留= 32800KB,已提交= 32KB)(mmap:保留= 32800KB,已提交= 32KB)
我注意到的一件事是此部分:内部(保留= 6366260KB,已提交= 6366256KB)
它持续增长,导致总内存使用量超过24GB限制。
有人见过类似的问题吗?谁知道这里的内部存储器是什么,并且可能会在不释放存储器的情况下保持增长的原因是什么?
小智 1
这不是您问题的答案,这只是一种解决方法。
我在 java 版本“1.8.0_45”上运行 JRuby 的 docker 容器中观察到同样的问题。解决方案是显式调用垃圾收集。我完全不知道为什么会这样,但 GC 后内部 Java 内存返回到 8MB。
| 归档时间: |
|
| 查看次数: |
1013 次 |
| 最近记录: |