java - Ubuntu 内核杀死 java 进程,即使它没有内存不足

标签 java linux amazon-ec2 linux-kernel out-of-memory

我有一个 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

最佳答案

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

the portion of memory occupied by a process that is held in main memory

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

您的程序占用的虚拟内存总计为287.5GB;这大概包括您分配的 128GB 堆中的其他 78GB。

关于java - Ubuntu 内核杀死 java 进程,即使它没有内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55996723/

相关文章:

Java 并行性 : OpenCL/GPUs vs. 参与者/线程

java - 通过socket java发送扩展ascii

java - ClassCastException 使用 Class.cast 使用泛型

linux - 无法找到完整路径 g++ 和 gcc

linux - CMake 目标链接库 G++ 标志与 OSX Clang 冲突

hadoop - 部署 Spark 的最佳方式?

java - 是否需要从 "old"onenote API 迁移到新的 microsoft graph api?

linux - 从 cshell (tcsh) 执行 bash shell

sql-server -/opt/mssql/bin/sqlservr : This program requires a machine with at least 2000 megabytes of memory

amazon-web-services - 为 nginx SSL 添加 .ebextensions 后,SpringBoot 部署失败 - [执行命令 [app-deploy] 时发生错误]