Linux内存占用过高?非也

本文通过实例解析了Linux系统中内存占用的实际计算方式,揭示了看似内存占用过高但实际仍有大量空闲内存的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

今天在我的RPi2上测试GPIO程序,忽然发现机器超卡,重启之后依然如此。于是我top了一下发现了一个问题就是内存爆满!!可我还啥都没干呢这是咋了?于是我呵呵地开始查资料,终于找到了问题所在。


正文

先来在阿里的ECS上top一下感受内存爆满的感觉

# top

top结果

结合操作系统,计组等课程,以及多年以来windows培养给我的直觉,认为0.96G(1016272K)的总内存,使用了0.84G(880960K)的内存,使用率高达88%。然而我还啥都没干,怎么会这样呢?

仔细查看还会发现后面有一个buffers,Swap后面还有一个Cached Mem。


现在我们用free来观察下

#free -m

free结果

虽然Mem显示了0.9G左右的used,但是-/+
buffers/cache(减去buffers和cache的结果)可以看到,当前进程实际占用内存是0.24G(256348K),而可用空闲(free)内存为0.72G(759924K)。

可以这么理解:在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于开启过的程序、或是读取刚存取过得数据会比较快。

如上面的例子:共1G的内存,0.9G被占用,但是buffer和cached
mem部分作为缓存,可以使用命中率的方式提高使用效率,而且这部分缓存是根据指令随时可以释放的,我们可以认为这部分内存没有实际被使用,也可以认为它是空闲的。

因此查看目前进程正在实际被使用的内存,是used-(buffers+cache),也可以认为如果swap没有大量使用,mem还是够用的,只有mem被当前进程实际占用完(没有了buffers和cache),才会使用到swap的。



再举个栗子: 这个是我在RPi一群看到的一个群友发的探针监测截图

探针监测

观察内存使用状况一栏,发现物理内存功925.89M,已用911.74M,Cache化的内存是676.46M,Buffers为61.3M,现在用上述公式:

真实的内存使用=used-(buffers+cache)
带入:
    真实使用内存 = 911.74-676.46-61.3 = 173.98
    与第三行的灰条的173.98相符

总结

很高兴对于linux的内存分配有了新的认识 多谢一群的 粵-打雜小白-503 Service Unavailable 的技术支持
多谢Licess’s Blog的精彩分析

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值