今天遇到了如下的内核报错
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00007f0e1e06c000, 65536, 1) failed; error='Cannot allocate memory' (errno=12)
这个报错是因为,linux会对大部分的内存资源申请都回复允许,以便于运行更多的程序。但是有些程序申请完内存后并不一定会立马使用,会持久化占用不释放,导致后续的服务,linux没有足够的内存提供给它,就会出现上面这个错误,这就叫做overcommit。这种程序常见的比如oracle的监控、hiveserver等这种持久化的程序
这个错误的解决方法除了加成本怼内存之外可以修改内存的分配策略,使得如果内存到了一定程度就直接拒绝了
策略修改在/etc/sysctl.conf
文件中的vm.overcommit_memory
配置项,它允许0到1三个配置
0:内核首先会检查是否有足够的内存分配,如果没有就反馈申请失败,也就是cannot allocate memory的出现,这是默认配置
1:内核允许超量使用内存直到内存用完为止
2:表示内核绝不允许超量使用内存,即分配出去的内存空间不能超过swap+50%的服务器总内存值
你也可以快捷修改
echo 0 > /proc/sys/vm/overcommit_memory
echo 50 > /proc/sys/vm/overcommit_ratio
sysctl -p