我确实在网上搜索了这个问题,但找不到可能的解决方案或解释。我们有一个 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 如何解决这个问题?我知道如果操作系统无法提供所需的内存,JVM 可能会因 OOM 而崩溃,但这里操作系统始终有超过 3 GB 的可用内存。请指教。/etc/proc/meminfo 的输出是:MemTotal: 8061104 kBMemFree: 4905068 kBBuffers: 172920 kBCached: 1828412 kBSwapCached: 0 kBActive: 1751828 kBInactive: 1129956 kBActive(anon): 872840 kBInactive(anon): 58348 kBActive(file): 878988 kBInactive(file): 1071608 kBUnevictable: 0 kBMlocked: 0 kBSwapTotal: 4194300 kBSwapFree: 4194300 kBDirty: 24 kBWriteback: 0 kBAnonPages: 880488 kBMapped: 334788 kBShmem: 50740 kBSlab: 133388 kBSReclaimable: 92196 kBSUnreclaim: 41192 kBKernelStack: 6880 kBPageTables: 23236 kBNFS_Unstable: 0 kBBounce: 0 kBWritebackTmp: 0 kBCommitLimit: 8224852 kBCommitted_AS: 1534484 kBVmallocTotal: 34359738367 kBVmallocUsed: 185660 kBVmallocChunk: 34359545792 kBHardwareCorrupted: 0 kBAnonHugePages: 493568 kBHugePages_Total: 0HugePages_Free: 0HugePages_Rsvd: 0HugePages_Surp: 0Hugepagesize: 2048 kBDirectMap4k: 251904 kBDirectMap2M: 7088128 kBDirectMap1G: 1048576 kB更新 我们注意到此操作系统上的交换内存不起作用,它总是显示已使用的 0 KB。这可能是 OOM 的潜在原因吗?
1 回答
Helenr
TA贡献1780条经验 获得超3个赞
Java HotSpot VM 分为 3 个内存空间(Java Heap、PermGen、C-Heap)。对于 32 位 VM,所有这些内存空间都会相互竞争内存。增加 Java 堆空间(使用 -Xmx)将进一步减少 C 堆的容量并为操作系统保留更多内存。
这也是为什么像您一样将 -Xmx 减少到 3000M 会使您的程序正常工作。
添加回答
举报
0/150
提交
取消