启动一个java应用报Cannot allocate memory,并且会生产一个hs_ess_pid.log文件。
文件内容为:
#内存不足,Java运行时环境无法继续。
#本机内存分配(mmap)无法映射4294967296字节以提交保留内存。
【排查】
1、尝试使用文件里的命令
ulimit -c unlimited。 用ulimit -a可以查看当前用户可执行的资源限制。使用ulimit -c unlimited来释放该限制。经尝试,无效。
2、查看进程数是否上限:
查看系统最大限制进程数:sysctl kernel.pid_max
查看当前进程数:ps -eLf |wc -l
上限为1000000, 目前才2664。pass掉
3、内存分配策略 overcommit_memory
overcommit_memory 是 Linux 系统内存管理的一个参数,它控制内存过量分配的行为。在 Linux 中,当程序请求分配内存时,系统会根据当前可用的物理内存和交换空间来决定是否允许分配所需的内存。overcommit_memory 参数影响了这一行为。
vm.overcommit_memory 参数有以下三个可能的取值:
0:表示“按需分配”。在此模式下,系统允许分配超过实际可用内存和交换空间总和的内存。
1:表示“允许过量分配”。在此模式下,系统允许超量使用内存,而不管实际可用内存和交换空间是否足够。
2:表示“不允许过量分配”。在此模式下,系统会拒绝任何超出实际可用内存和交换空间总和的内存分配请求。
当前环境下改参数为overcommit_memory=2,从而导致服务启动时拿不到所需内存。
解决办法:修改参数,将其改为1。保存退出重启服务解决。
vim /etc/sysctl.conf
修改完后执行 sysctl -p 将其参数生效。
如果/etc/sysctl.conf没有这个值,修改此处/proc/sys/vm/overcommit_memory