【linux|java应用报错】Cannot allocate memory

启动一个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

您好!对于您遇到的问题,"Cannot allocate memory" 错误通常表示内存不足导致无法为进程分配内存空间。 造成这种情况的原因可能有以下几种情况: 1. 系统内存不足:请确保您的系统具有足够的可用内存,以支持启动 datanode 进程。您可以使用 `free -h` 命令来查看系统内存使用情况。 2. ulimit 限制:检查系统 ulimit 设置是否限制了进程可使用的内存。可以通过运行 `ulimit -a` 命令来查看当前的 ulimit 设置。 如果发现限制较低,可以考虑修改 ulimit 设置来增加可用的内存限制。这可以通过编辑 `/etc/security/limits.conf` 文件并增加如下配置行来实现: ``` * soft memlock unlimited * hard memlock unlimited ``` 3. 物理内存与虚拟内存(swap)不足:检查系统的物理内存和虚拟内存是否充足。如果物理内存不足,可以考虑增加物理内存或者开启 swap 分区来扩充虚拟内存。 您可以使用 `swapon -s` 命令来查看当前系统中是否存在 swap 分区。如果没有可用的 swap 分区,可以创建一个新的 swap 分区并启用它。 请注意,虚拟内存通常比物理内存速度慢得多,因此这只是一种暂时的解决方案,您可能需要进一步调查为什么系统需要更多的内存。 4. 其他进程占用了过多的内存:请确保没有其他进程占用了大量的内存资源,导致无法为 datanode 进程分配足够的内存。可以使用 `top` 或 `htop` 命令来查看系统中正在运行的进程和它们的内存占用情况。 希望以上信息对您有所帮助!如果您有任何其他问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

维运

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值