【问题标题】:Ubuntu kernel killing java process even though it is not out of memoryUbuntu内核杀死java进程,即使它没有内存不足
【发布时间】: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


【解决方案1】:

要看的关键是anon-rss:191924060kB。 RSS 是Resident set size,维基百科文章将其定义为

主存中进程占用的内存部分

加上逗号,191,924,060kB 仅差 192Gb。其中,50GB 是 Java 堆的一部分——Java 用于在运行时分配的对象的空间——实际上是在使用中的。其余部分包括 JVM 运行时、您的程序可能使用的任何库,当然还有您的程序本身。

你的程序占用的总虚拟内存是287.5GB;这大概包括您分配的 128GB 堆中的另外 78GB。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 2018-09-08
    • 2018-09-30
    • 2021-07-01
    • 2020-08-11
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多