【发布时间】:2019-12-25 13:25:02
【问题描述】:
我的 java 进程在一段时间后被杀死。堆设置为 min - 2 Gb 和 max 3 Gb with parallel GC。从 pmap 命令,它显示了 40 多个 64Mb 匿名块,这似乎导致了 linux OOM 杀手。
错误:
Java 运行时环境内存不足 继续。本机内存分配 (mmap) 无法映射 71827456 用于提交保留内存的字节。可能原因:系统 超出物理 RAM 或交换空间 在 32 位模式下,进程 达到大小限制 可能的解决方案: 减少 系统 增加物理内存或交换空间 检查交换后备存储是否已满 在 64 位操作系统上使用 64 位 Java 减少 Java 堆大小 (-Xmx/-Xms) 减少 Java 数量 线程 减少 Java 线程堆栈大小 (-Xss) 设置更大的代码 使用 -XX:ReservedCodeCacheSize= 缓存此输出文件可能是 被截断或不完整。
内存不足错误 (os_linux.cpp:2673), pid=21171, tid=140547280430848
JRE 版本:Java(TM) SE 运行时环境 (8.0_51-b16) (build 1.8.0_51-b16) Java VM:Java HotSpot(TM) 64 位服务器 VM(25.51-b03 混合模式 linux-amd64 压缩 oops)无法写入核心转储。 核心转储已被禁用。要启用核心转储,请尝试“ulimit -c 无限制”,然后再次启动 Java
尝试将堆减少到最小 512 Mb 和最大 2 Gb 以及 G1GC,我们看到 18 左右的 64 Mb 块数量有限,并且进程没有被杀死。
但是在堆最小 2Gb 和最大 3Gb 以及 G1GC 的情况下,我们看到大量 64 Mb 块。
根据文档,具有 2 个内核的 64 位系统的最大 64Mb 块数(malloc arenas)可以是 2*8 = 16,但我们看到超过 16 个。
【问题讨论】:
-
这个程序可以在任何容器环境中执行吗?
-
在虚拟机(centos9)上运行
标签: java linux-kernel glibc mmap