救命,Linux正在吃掉我的内存!

Android 操作系统的内存回收机制 Android APP 的运行环境 Android 是一款基于 Linux 内核,面向移动终端的操作系统。为适应其作为移动平台操作系统的特殊需要,谷歌对其做了特别的设计与优化,使得其进程调度与资源管理与其他平台的 Linux 有明显的区别。主要包含下面几个层次: Application Framework Application Framework 将整个操作系统分隔成两个部 阅读详情

内存发现自己的空闲空间越来越少,经过一番调查,发现罪魁祸首居然是Linux老大!

内存:Linux老大,这也没几个程序在运行,可是你为什么老是占用我的内存啊,内存都快被你吃光了!

Linux :你的容量那么大,空间闲着也是闲着,我啊,把那些空闲的空间都当成文件缓存了!

内存:  你看看你, 把这文件“拆成”了4K的碎片,这儿放一片,那儿放一片,把我的内存空间搞得乱糟糟的。

Linux :这叫做Page Cache , 其实一点也不乱,文件在哪一“片”内存中放着,我记得清清楚楚。我这么做也是不得已而为之啊,硬盘太慢,比你慢几万倍。CPU的一秒,你这里就是6分钟,硬盘那里就是好几个月!每次从他那里读点儿数据,几个月才给我回话, 我只好把读出来的数据先缓存到你这里了。 

内存看到这张表格,不由得咂舌:没想到这外面的世界如此之慢啊!

正在此时, 一个叫helloworld的程序要读取文件。 

helloworld :老大,我给你发了一个read系统调用,要读取config.txt的前1024个字节,把结果放到我的buffer中。 

Linux :好,让我看看config.txt是不是已经在Page Cache中了,真不巧,还没缓存过。内存老弟,我又要吃你的空闲空间了。 

Linux在内存中分配了一个4k 大小的page frame, 向硬盘发出DMA指令,读取cong.txt的4k的数据。

内存感觉奇怪:人家helloworld只要1024个字节,你干嘛让硬盘发过来4K数据? 

Linux :我这里Page cache 都是以4K为单位的, 读一次得等几个月,还不多读一点?再说helloworld这小子很可能继续读文件的后续部分,下次就不用访问硬盘了。

过了“几个月” , 硬盘的数据复制到了内存的Page cache 中

内存说:这就完事了吧? 

Linux :怎么可能!我得从Page cache 中取出前1024个字节,复制到helloworld指定的buffer 中。

这个buffer其实是helloworld虚拟地址空间heap上的地址,物理地址也是在你的内存中。

内存:我的天!难道数据要在我内存中出现两份?

Linux :没错!你不知道,复制数据还得用CPU呢!很费劲的。

helloworld:老大,能不能让我直接访问你Page cache 中的数据?

Linux :那怎么行,你在用户空间,我在内核空间,你要是能访问,在我这里捣乱怎么办?必须禁止!

内存:嗯,有道理,不过,要是还有个程序,也要读取config.txt的前1024个字节,怎么办?

Linux:  那就简单了啊, 我一查就知道数据已经在Page cache中了,不用等几个月从硬盘读了,直接复制到那个程序的缓冲区就行了。 

内存:啊?这数据重复太多了吧!

Linux :嗯,确实是个问题,现在这些程序,动辄访问几十个文件,每个程序都复制一份,确实是巨大的浪费。

内存:我给你支个招,既然那些程序运行访问的都是虚拟地址,你让这些虚拟地址映射到Page cache上,大家不就可以共享了。 

Linux :好主意,我来提供一个叫做mmap的系统调用,完成你说的功能。 

helloworld运行结束,退出了。 

内存:  helloworld退出了,你一会儿会清理掉对应的page cache吧?

Linux:暂时不会!

内存:啊?怪不得内存快被你吃光了!

Linux : 唉呀,你的内存闲着也是闲着,文件缓存着,下次再访问的时候,性能会有巨大提升!你放心,我会在合适的时机清理掉page cache的。 

内存:那如果helloword修改文件内容呢?会立即写入硬盘吗?

Linux :也不会,我只是标记这个Page cache “dirty”了, 然后我定期写入硬盘。

内存:你怎么能这样!这不是欺骗那些程序吗!那要是断电怎么办?

Linux:对于需要及时写入硬盘的,有两种办法,一是调用我提供的fsync方法强制写入硬盘,二是在访问文件的时候,可以指定不用Page cache。 

内存:相当于什么都没说,不用Page cache 多慢啊。 

Linux :你现在也知道page cache的重要性了吧。page cache 是一种比较通用的文件缓存机制,是我来管理的。有些应用,比如数据库,他需要更加灵活、更加复杂的文件缓存,那他就不用page cache ,自己另起炉灶了。 

内存:啊?数据库也在把我当作缓存?

Linux : 哈哈,是啊,要怪就怪硬盘吧,谁让它那么慢!不过他要是和你一样快,你小子就要下岗了,你想想,在一个访问速度超快,容量超大,还不怕断电威胁的存储器面前,你是不是就变成渣渣了?

内存叹了一口气: 好吧,我也管不了了,你们随意折腾吧。 

后记:本文的第一个图和标题来自

https://www.linuxatemyram.com/, 文章的内容参考了https://manybutfinite.com/post/page-cache-the-affair-between-memory-and-files/ ,确切说,本文是加了料的改编版, 这个博客还有几篇关于虚拟内存的文章,非常棒,强烈建议大家去看看英文原文。

宇宙第一IDE到底是谁?

Node.js :我只需要一个店小二

HTTP Server :一个差生的逆袭

我要穿越,干翻“烂语言”JavaScript

如何降低程序员的工资?

程序员,你得选准跑路的时间!

两年,我学会了所有的编程语言!

一直CRUD,一直996,我烦透了,我要转型

字节码万岁!

上帝托梦给我说:一切皆文件

Javascript: 一个屌丝的逆袭

我是一个线程

TCP/IP之大明邮差

一个故事讲完Https

CPU 阿甘

安卓内存管理优化工具:吃掉内存2.0 Android平台上的应用程序运行在有限的资源环境中,特别是内存资源。内存管理是确保应用高效运行、避免系统崩溃和性能下降的关键。一个良好的内存管理机制可以显著提高应用的稳定性和用户体验。 阅读详情

相关推荐

深入AutoSar诊断协议栈:当ECU报故障时,FiM模块是如何悄悄“阉割”功能的?

本文深入解析AutoSar诊断协议栈中FiM模块的工作原理,揭示ECU报故障时如何通过Inhibition Counter和位运算技术实现功能静默降级。探讨FiM在故障处理链中的关键角色,包括功能权限仲裁、降级策略执行和系统安全兜底,并分享实战调试技巧与进阶应用案例。

weixin_30673611的博客 174

Linux偷偷“吃”了我的内存?

不知道刚使用Linux的小伙伴有没有遇到过这样的情况,有一天你看到自己的内存空间变少了,在一探究竟后,发现幕后“真凶”竟然是Linux!这到底怎么回事呢? 发生了什么事? 其实这是Linux正在借用未使用的内存进行磁盘缓存。这意味着内存看起来变少了,但实际上并没有。Linux之所有这么做,主要是为了让系统运行的更快,更流畅。除了让新手感到困惑外,它不会以任何方式占用应用程序的内存。 我如果想运行更多的应用程序怎么办? 当然,Linux确实借用了你的内存,注意这里是借用,不是占用。当应用程序需

qq_43529978的博客 1万+

OpenCV和Halcon分别实现彩色图像的白平衡效果

实现白平衡算法中的灰度世界法,能有效改善图像发红/发蓝/发绿的现象 1、OpenCV #include <opencv2/opencv.hpp> using namespace cv; int main() { Mat g_srcImage,dstImage; vector<Mat> g_vChannels; g_srcImage = im...

$firecat利白的代码足迹$ 2829

【原创分享】Linux系统中释放内存的方法

在Linux系统中,释放内存可以通过多种方法来实现。

SunMy的博客 3514

如何优化Silvaco二极管仿真网格?这些参数设置技巧让你的结果更精确

本文详细介绍了如何优化Silvaco二极管仿真网格,通过精细调整网格参数提升仿真精度。重点解析了网格密度与计算精度的权衡、关键区域识别与网格强化策略,以及掺杂分布与网格适配技术,帮助工程师在半导体器件仿真中获得更准确的结果。

t8u9v0w1x的博客 660

树莓派4B系统安装及SSH远程控制(简单易操作)

​自从2022年4月树莓派官网更新了RaspberryPiImager版本v1.7.2后,便不再支持自行建立ssh文件,并用默认用户名pi和密码raspberry的方式进行远程控制(亲测不行,输密码时一直access denied)。但是该版本软件提供了烧录系统前设置ssh用户及密码功能。本文记录了系统安装和SSH远程操作步骤。........................

机械人的代码路 5790

【Linux】服务器内存缓存占用高

我辈李想:文章原创,转载时请务必加上、作者信息和本声明。

黎明总是如期而至 1740

uniapp APP分享;判断用户是否安装APP,已安装直接打开,未安装跳转下载页;uniapp 在外部打开APP(schemes)

A将某商品分享给B,B点击后判断是否安装APP,若安装直接打开,没有安装则跳转下载页;

@微你 5681

linux 占用缓存前10_救命,Linux正在吃掉我的内存!

内存发现自己的空闲空间越来越少,经过一番调查,发现罪魁祸首居然是Linux老大!内存:Linux老大,这也没几个程序在运行,可是你为什么老是占用我的内存啊,内存都快被你吃光了!Linux :你的容量那么大,空间闲着也是闲着,我啊,把那些空闲的空间都当成文件缓存了!内存: 你看看你, 把这文件“拆成”了4K的碎片,这儿放一片,那儿放一片,把我的内存空间搞得乱糟糟的。Linux :这叫做P...

weixin_39958019的博客 112

用 ADBC 把动态查询做得又快又稳:从 CL_SQL_STATEMENT 到安全取数的工程化实践

本文介绍了ABAP中ADBC(ABAP Database Connectivity)技术的核心用法与最佳实践。ADBC作为Open SQL的补充,适用于动态查询、数据库特性调用等场景。文章通过示例代码详细演示了使用ADBC执行查询的完整流程:创建SQL语句、执行查询获取结果集、批量装载数据到内表,以及分包读取处理大数据量。特别强调了动态SQL的安全防护措施,包括输入转义和参数绑定等防注入技术。同时对比了ADBC与Open SQL的适用场景,指出ADBC更适合需要动态访问数据库原生功能的场合。文章还分析了代码

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1773

基于深度学习的生活垃圾检测与分类系统:YOLOv5、YOLOv6、YOLOv7与YOLOv8实现

本项目的目标是开发一个基于YOLO系列模型的生活垃圾检测与分类系统。数据集准备与标注:收集并标注生活垃圾图像数据集。模型训练:使用YOLOv5、YOLOv6、YOLOv7、YOLOv8等深度学习模型训练垃圾分类系统。UI界面设计:设计一个简洁的用户界面,支持图像或视频的上传与垃圾分类结果展示。实时垃圾检测与分类:通过摄像头进行实时垃圾检测和分类。结果展示与保存:展示检测结果,支持用户保存分类后的图像或视频。

YOLO 705

救命,Linux正在吃掉我的内存

内存发现自己的空闲空间越来越少,经过一番调查,发现罪魁祸首居然是Linux老大! 内存:Linux老大,这也没几个程序在运行,可是你为什么老是占用我的内存啊,内存都快被你吃光了! Linux :你的容量那么大,空间闲着也是闲着,我啊,把那些空闲的空间都当成文件缓存了! 内存: 你看看你, 把这文件“拆成”了4K的碎片,这儿放一片,那儿放一片,把我的内存空间搞得乱糟糟的。 Linux :这叫做Page Cache , 其实一点也不乱,文件在哪一“片”...

weixin_48674103的博客 147

【WorkBuddy专栏51】Codex与WorkBuddy的底层基因——两条完全不同的AI智能体路线(上)

【WorkBuddy专栏51】Codex与WorkBuddy的底层基因——两条完全不同的AI智能体路线(上)

AI人人懂 2175

linux 无缘无故吃内存,救命,Linux正在吃掉我的内存

... 内存发现自己的空闲空间越来越少,经过一番调查,发现罪魁祸首居然是Linux老大!内存:Linux老大,这也没几个程序在运行,可是你为什么老是占用我的内存啊,内存都快被你吃光了!Linux :你的容量那么大,空间闲着也是闲着,我啊,把那些空闲的空间都当成文件缓存了!... 内存: 你看看你, 把这文件“拆成”了4K的碎片,这儿放一片,那儿放一片,把我的内存空间搞得乱糟糟的。Linux :...

weixin_39614262的博客 334

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

文件读取 linux_救命,Linux正在吃掉我的内存

内存发现自己的空闲空间越来越少,经过一番调查,发现罪魁祸首居然是Linux老大!内存:Linux老大,这也没几个程序在运行,可是你为什么老是占用我的内存啊,内存都快被你吃光了!Linux :你的容量那么大,空间闲着也是闲着,我啊,把那些空闲的空间都当成文件缓存了!内存: 你看看你, 把这文件“拆成”了4K的碎片,这儿放一片,那儿放一片,把我的内存空间搞得乱糟糟的。Linux :这叫做Page C...

weixin_29326909的博客 106

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

linux 占用缓存前10_救命,Linux正在吃掉我的内存

内存发现自己的空闲空间越来越少,经过一番调查,发现罪魁祸首居然是Linux老大!内存:Linux老大,这也没几个程序在运行,可是你为什么老是占用我的内存啊,内存都快被你吃光了!Linux :你的容量那么大,空间闲着也是闲着,我啊,把那些空闲的空间都当成文件缓存了!内存: 你看看你, 把这文件“拆成”了4K的碎片,这儿放一片,那儿放一片,把我的内存空间搞得乱糟糟的。Linux :这叫做Page C...

weixin_39517241的博客 71

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

100个Linux救命命令速查手册:从删库到跑路?不存在的!

在Linux运维和开发的征途上,谁没遇到过几个“心跳骤停”的瞬间?误删关键文件、服务莫名宕机、磁盘空间告罄、网络突然失联…“删库跑路”的段子背后,是对系统掌控力的考验。别慌!这份集结了100个关键时刻能拉你一把的Linux命令和技巧。它们不是日常花拳绣腿,而是真正能在系统“危难之际”帮你诊断、恢复、止损的利器。。跑路?不存在的!

yy1715713348的博客 776

Linux 最强命令合集!我常用的 20 个系统救命技巧

这些年,我做过装机、维护、救火,从 Windows 到 Linux, 总结出 20 条真正“救过命”的命令。拷数据最稳的命令,没有之一。无论是迁移日志、同步备份,还是紧急抢救数据,它都能稳稳干活。当你能用冷静把问题切开时, 你就不仅是运维,而是掌控系统的人。技术人的成长,不是背命令表, 而是经历过多少次“心跳加速后仍然冷静”。有时不是系统坏了,而是太累了。Linux 不只是系统, 它是一种面对混乱时的秩序感。记录每一次系统救援的瞬间 走正道,不走捷径。最常用的“十行命令”,快速看出谁在搞风浪。

m0_46253397的博客 717

Systemd 吃掉 7.4GB 内存?测试环境的一次意外发现

当你发现 systemd 进程占用了 7.4GB 内存时,第一反应是:"我是不是看错了?"

1091

救命!我的 Linux 系统好像在疯狂健身

家人们谁懂啊!今天登录服务器一看,好家伙,这平均负载数值直接飙到两位数,我仿佛看见我的 Linux 系统正举着 CPU 杠铃疯狂撸铁,一边还喊着 “再来亿个进程!”​ 这平均负载到底是个什么神奇玩意儿?它就像系统的 “压力温度计”,不仅能告诉你这一秒系统有多忙,还能通过 1 分钟、5 分钟、15 分钟的 “压力曲线”,预测它会不会突然累到罢工。要是数值比 CPU 核心数还高,那就相当于系统在说:“救命!我被进程大军包围了!”

cuiwin的专栏 1036
上一篇: 我的人工智能好基友
下一篇: 我的一个重要决定
码农翻身
码农翻身 《码农翻身》作者 《码农翻身》作者
博客等级 码龄8年 3万+粉丝 1084原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值