高 XMX:java.lang.outofmemory 本机内存分配 (malloc) 无法为 ChunkPool::allocate 分配 32756 字节
High XMX: java.lang.outofmemory native memory allocation (malloc) failed to allocate 32756 bytes for ChunkPool::allocate
我确实在网上搜索过这个问题,但找不到可能的解决方案或解释。
我们有一个 CentOS 6 VM,8 GB RAM,64 位,Open JDK 1.8。我们正在尝试 运行 一个带有 -Xmx6000M 的 Java 程序。
它只是在开始时崩溃并出现以下内存不足错误:
native memory allocation (malloc) failed to allocate 32756 bytes for ChunkPool::allocate
它只执行了开始的几行代码(那里没有太多内存分配<500MB)并不断崩溃。
有趣的是,如果我将 -Xmx 更改为 3000M,它会开始正常工作并且我的程序已启动并且一切正常。
根据我的理解,Xmx 表示 JVM 可以达到的最大堆内存,它是按需分配的。因此,即使 JVM 未达到 1 GB 堆,我也无法理解它是如何导致崩溃的,以及减少 Xmx 如何解决它?
我知道如果 OS 无法提供所需的内存,JVM 可能会因 OOM 而崩溃,但这里 OS 总是有超过 3 GB 的可用内存。
请指教
/etc/proc/meminfo 的输出是:
MemTotal: 8061104 kB
MemFree: 4905068 kB
Buffers: 172920 kB
Cached: 1828412 kB
SwapCached: 0 kB
Active: 1751828 kB
Inactive: 1129956 kB
Active(anon): 872840 kB
Inactive(anon): 58348 kB
Active(file): 878988 kB
Inactive(file): 1071608 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 4194300 kB
SwapFree: 4194300 kB
Dirty: 24 kB
Writeback: 0 kB
AnonPages: 880488 kB
Mapped: 334788 kB
Shmem: 50740 kB
Slab: 133388 kB
SReclaimable: 92196 kB
SUnreclaim: 41192 kB
KernelStack: 6880 kB
PageTables: 23236 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 8224852 kB
Committed_AS: 1534484 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 185660 kB
VmallocChunk: 34359545792 kB
HardwareCorrupted: 0 kB
AnonHugePages: 493568 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 251904 kB
DirectMap2M: 7088128 kB
DirectMap1G: 1048576 kB
更新
我们注意到一件事 OS 上的交换内存不起作用,它始终显示 0 KB 已使用。这可能是 OOM 的潜在原因吗?
Java HotSpot VM 分为 3 个内存 spaces(Java 堆、PermGen、C 堆)。对于 32 位 VM,所有这些内存 space 都会相互竞争内存。增加 Java 堆 space(使用 -Xmx)将进一步减少 C 堆的容量并从 OS.
中保留更多内存
这也是为什么像您那样将 -Xmx 减少到 3000M 会使您的程序正常工作。
详情请见
https://javaeesupportpatterns.blogspot.com/2012/03/outofmemoryerror-out-of-swap-space.html
我确实在网上搜索过这个问题,但找不到可能的解决方案或解释。
我们有一个 CentOS 6 VM,8 GB RAM,64 位,Open JDK 1.8。我们正在尝试 运行 一个带有 -Xmx6000M 的 Java 程序。
它只是在开始时崩溃并出现以下内存不足错误:
native memory allocation (malloc) failed to allocate 32756 bytes for ChunkPool::allocate
它只执行了开始的几行代码(那里没有太多内存分配<500MB)并不断崩溃。
有趣的是,如果我将 -Xmx 更改为 3000M,它会开始正常工作并且我的程序已启动并且一切正常。
根据我的理解,Xmx 表示 JVM 可以达到的最大堆内存,它是按需分配的。因此,即使 JVM 未达到 1 GB 堆,我也无法理解它是如何导致崩溃的,以及减少 Xmx 如何解决它?
我知道如果 OS 无法提供所需的内存,JVM 可能会因 OOM 而崩溃,但这里 OS 总是有超过 3 GB 的可用内存。
请指教
/etc/proc/meminfo 的输出是:
MemTotal: 8061104 kB
MemFree: 4905068 kB
Buffers: 172920 kB
Cached: 1828412 kB
SwapCached: 0 kB
Active: 1751828 kB
Inactive: 1129956 kB
Active(anon): 872840 kB
Inactive(anon): 58348 kB
Active(file): 878988 kB
Inactive(file): 1071608 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 4194300 kB
SwapFree: 4194300 kB
Dirty: 24 kB
Writeback: 0 kB
AnonPages: 880488 kB
Mapped: 334788 kB
Shmem: 50740 kB
Slab: 133388 kB
SReclaimable: 92196 kB
SUnreclaim: 41192 kB
KernelStack: 6880 kB
PageTables: 23236 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 8224852 kB
Committed_AS: 1534484 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 185660 kB
VmallocChunk: 34359545792 kB
HardwareCorrupted: 0 kB
AnonHugePages: 493568 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 251904 kB
DirectMap2M: 7088128 kB
DirectMap1G: 1048576 kB
更新 我们注意到一件事 OS 上的交换内存不起作用,它始终显示 0 KB 已使用。这可能是 OOM 的潜在原因吗?
Java HotSpot VM 分为 3 个内存 spaces(Java 堆、PermGen、C 堆)。对于 32 位 VM,所有这些内存 space 都会相互竞争内存。增加 Java 堆 space(使用 -Xmx)将进一步减少 C 堆的容量并从 OS.
中保留更多内存这也是为什么像您那样将 -Xmx 减少到 3000M 会使您的程序正常工作。
详情请见 https://javaeesupportpatterns.blogspot.com/2012/03/outofmemoryerror-out-of-swap-space.html