Java JVM崩溃,错误=';无法分配内存';(错误号=12)
我的代码因此错误消息而崩溃Java JVM崩溃,错误=';无法分配内存';(错误号=12),java,memory-management,Java,Memory Management,我的代码因此错误消息而崩溃 Executing "/usr/bin/java com.utils.BotFilter" OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000357c80000, 2712666112, 0) failed; error='Cannot allocate memory' (errno=12) 内存不足,Java运行时环境无法继续。 本机内存分配(malloc)无法分配27126
Executing "/usr/bin/java com.utils.BotFilter"
OpenJDK 64-Bit Server VM warning: INFO:
os::commit_memory(0x0000000357c80000, 2712666112, 0) failed;
error='Cannot allocate memory' (errno=12)
内存不足,Java运行时环境无法继续。
本机内存分配(malloc)无法分配2712666112字节以提交保留内存。
包含详细信息的错误报告文件另存为:
/tmp/jvm-29955/hs_error.log`
以下是生成的hs_error.log文件的内容:
我对崩溃日志中的这句话很感兴趣:
Memory: 4k page, physical 98823196k(691424k free), swap 1048572k(0k free)
这是否意味着机器有内存,但交换空间不足
这是崩溃日志中的meminfo,但我真的不知道如何解释它,比如MemFree和MemAvailable之间有什么区别?这个过程需要多少内存
/proc/meminfo
:
MemTotal: 98823196 kB
MemFree: 691424 kB
MemAvailable: 2204348 kB
Buffers: 145568 kB
Cached: 2799624 kB
SwapCached: 304368 kB
Active: 81524540 kB
Inactive: 14120408 kB
Active(anon): 80936988 kB
Inactive(anon): 13139448 kB
Active(file): 587552 kB
Inactive(file): 980960 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 1048572 kB
SwapFree: 0 kB
Dirty: 1332 kB
Writeback: 0 kB
AnonPages: 92395828 kB
Mapped: 120980 kB
Shmem: 1376052 kB
Slab: 594476 kB
SReclaimable: 282296 kB
SUnreclaim: 312180 kB
KernelStack: 317648 kB
PageTables: 238412 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 50460168 kB
Committed_AS: 114163748 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 314408 kB
VmallocChunk: 34308158464 kB
HardwareCorrupted: 0 kB
AnonHugePages: 50071552 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 116924 kB
DirectMap2M: 5115904 kB
DirectMap1G: 95420416 kB
...
CommitLimit: 45329388 kB
Committed_AS: 44818080 kB
...
可能的解决办法:
- 减少系统上的内存负载
- 增加物理内存或交换空间
- 检查交换备份存储是否已满
- 在64位操作系统上使用64位Java
- 减少Java堆大小(-Xmx/-Xms)
- 减少Java线程的数量
- 减少Java线程堆栈大小(-Xss)
- 使用-XX:ReservedCodeCacheSize设置较大的代码缓存=
- 如果您在tomcat上部署了许多上下文,请尝试减少它们
如前所述,JVM正试图分配2712666112字节(2.7 Gb)的内存,而您只有691424000字节(0.69 Gb)的可用物理内存,交换时没有可用内存 另一种可能性(我刚才遇到过)是linux上“过度使用内存”的错误设置
在我的情况下,/proc/sys/vm/overmit_内存
设置为“2”,而/proc/sys/vm/overmit_比率
设置为“50”,这意味着“永远不要过度分配,只允许分配50%的可用RAM+交换”
这是一个相当具有欺骗性的问题,因为可能有很多内存可用,但分配仍然会毫无理由地失败
现在(直到重新启动),可以将设置更改为默认设置(以合理的方式过度提交):
。。。或永久:
echo "vm.overcommit_memory=0 >> /etc/sysctl.conf
sysctl -p /etc/sysctl.conf # apply it immediately
注意:这也可以通过查看/proc/meminfo
的输出部分进行诊断:
MemTotal: 98823196 kB
MemFree: 691424 kB
MemAvailable: 2204348 kB
Buffers: 145568 kB
Cached: 2799624 kB
SwapCached: 304368 kB
Active: 81524540 kB
Inactive: 14120408 kB
Active(anon): 80936988 kB
Inactive(anon): 13139448 kB
Active(file): 587552 kB
Inactive(file): 980960 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 1048572 kB
SwapFree: 0 kB
Dirty: 1332 kB
Writeback: 0 kB
AnonPages: 92395828 kB
Mapped: 120980 kB
Shmem: 1376052 kB
Slab: 594476 kB
SReclaimable: 282296 kB
SUnreclaim: 312180 kB
KernelStack: 317648 kB
PageTables: 238412 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 50460168 kB
Committed_AS: 114163748 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 314408 kB
VmallocChunk: 34308158464 kB
HardwareCorrupted: 0 kB
AnonHugePages: 50071552 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 116924 kB
DirectMap2M: 5115904 kB
DirectMap1G: 95420416 kB
...
CommitLimit: 45329388 kB
Committed_AS: 44818080 kB
...
在问题中的示例中,Committed\u AS
远高于committelimit
,这表明(连同分配失败的事实)启用了过度提交,而这里两个值接近,这意味着严格执行限制
关于这些设置及其效果(以及修改它们的意义)的详细说明,请参见本文。(Tl;dr:如果您不想让关键流程使用swap,那么处理过度提交是很有用的)您是否有2712666112
字节?看起来不错,但是,您能帮助我如何/在哪里更改所有这些吗。