【发布时间】:2019-05-06 06:32:38
【问题描述】:
我有一个具有 48 个内核和 192 GB 内存和 Ubuntu 18.04 的 ec2 实例。我正在其上运行一个 java 应用程序,其中最大内存设置为 128 GB。在这之间,java 应用程序被 linux 内核杀死。我连接了 JVisualVM,而且 GC 日志说 Java VM 最多只占用 50GB 堆。那么,为什么 Linux 会杀死 Java 应用程序呢?这台机器上没有其他东西在运行,只是应用程序。我尝试运行 dmesg,我看到的是:
[166098.587603] Out of memory: Kill process 10273 (java) score 992 or sacrifice child
[166098.591428] Killed process 10273 (java) total-vm:287522172kB, anon-rss:191924060kB, file-rss:0kB, shmem-rss:0kB
[166104.034642] oom_reaper: reaped process 10273 (java), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB
【问题讨论】:
-
你可以尝试禁用oom reaper (killer)
-
您还可以禁用 Linux 用于虚拟内存的过度提交策略。另见Effects of configuring vm.overcommit_memory。顺便说一句,Solaris 不会过度订阅内存。如果应用程序要求 100 GB 内存,则将有 100 GB 可用虚拟内存,否则分配将失败。 Solaris 在分配后从不会遇到 OOM 终止。
标签: java linux amazon-ec2 linux-kernel out-of-memory