物理内存充足,但是为什么用代码总申请不到内存呢?

当一个拥有8GB内存的ECS服务器在Java尝试申请4GB内存时出现OOM异常,作者通过排查配置、系统状态,揭示了`overcommit_memory`参数在内存分配中的关键作用。在不同设置下,该参数如何影响内核对内存申请的策略,以及如何解决此类问题。
摘要由CSDN通过智能技术生成

点击上方蓝色字体,关注我 ——

一个在阿里云打工的清华学渣!

图 by:我是严肃的于海童@清华

本文作者:杨牧原(花名牧原),阿里云技术专家,多年操作系统和应用调试经验,理论功底深厚,实践经验丰富。目前专注Linux性能调优,容器集群和系统网络。

本文经原作者授权发于公众号【程序猿石头】,原文基础上稍作措辞改动。

背景

某次遇到一个客户尝试用 Java (其实跟具体用什么语言没关系)申请使用 4G 的内存申请,机器(ECS)总内存是 8G,free 的内存也超过 4G,按道理是 OK 的,但总是直接 OOM。

于是便找上门来说,“你们这玩意有问题啊?”

内心 :“bug 是不可能有的,一定是你的打开姿势不对”,恩,不行,本着“客户第一”的原则,还是要来帮客户解锁姿势的。

本文就详细记录了这个 case 的排查过程。

具体过程

申请4g内存失败

如上图所示,记录显示为申请 4G 内存失败(4294967296 B / 1024 / 1024 = 4096 M)。

是否是 min_free_kbytes & nr_hugepage 配置错误?

  1. 第一反应是想起来之前的 vm.min_free_kbytes & nr_hugepage 导致的free大于available案例有关

memfree 统计的是所有内存的 free 内存,而 memavailable 统计的是可以拿来给程序用的内存,而客户设置了 vm.min_free_kbytes(2.5G),这个内存在 free 统计,但是不在 memavailable 统计,nr_hugepage 也会有这个问题。

二者的统计方式不一样, 具体参考 Documentation/filesystems/proc.txt

  • MemFree: The sum of LowFree+HighFree

  • MemAvailable: An estimate of how much memory is available for starting new applications, without swapping. Calculated from MemFree, SReclaimable, the size of the file LRU lists, and the low watermarks in each zone. The estimate takes into account that the syste

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值