![cab5b2c953a7ac57aa3a020e5f592215.png](https://img-blog.csdnimg.cn/img_convert/cab5b2c953a7ac57aa3a020e5f592215.png)
刚才回答了个问题,觉得回答不太完整,就写篇文章详细阐述下自己的想法。
win10内存的利用规律是什么,为什么有些时候会自己回收内存?www.zhihu.com内存买来就是拿来用的,所以内存被占满了,肯定是数据干的。那么具体是什么数据呢?
我们先来给数据划分几种类型:
1.有用数据,就是程序主动申请起来的数据。
2.缓存数据,就是操作系统把文件读到内存里,当你访问文件的时候直接读内存就行了。
先声明,缓存数据不是“无用”数据,有用数据也不是随时随刻都“有用”。
然后我们要给数据存放的地点也划分一下:
1.物理内存,就是你买的内存条。容量是定死的。
2.页面文件,就是你的机械硬盘/固态硬盘。容量可变,但也有上限。
数据和地点是正交的,即有用数据可能在物理内存上,也可能在页面文件上。但缓存数据一般只可能在物理内存上。
最后我们还要明确几个概念:
1.虚拟内存和页面文件
虚拟内存不等于页面文件。虚拟内存是无时无刻都存在的,你的chrome和qq都可能会申请到0xabadcafe的内存空间,但却不会互相影响,这就是因为虚拟内存的存在。虚拟内存是和物理内存相对应的。
你可以想象一下手机上的沙箱,两个程序互相看不到彼此的文件。但他们又都真实地存在手机的NAND上。
虚拟内存还有个好处就是4G的物理内存我可以假装给你16G的虚拟内存,至于凭空多出的12G哪来的?这个不能像央行印钞票一样产生出来,那就得放在页面文件上。
2.速度
内存>固态硬盘>机械硬盘,每一级之间的差距都是几十倍。
此外内存的随机读写/持续读写速度差异不大,硬盘上则持续读写通常远高于随机读写。
3.内存和硬盘
内存是易失性储存器,硬盘是非易失性储存器。换句话说,断电了内存上东西就没了,硬盘上还有。所以大多数数据最终都要在硬盘上。
好了,可以开始正式讨论了。
Q:物理内存里放了什么?
A:物理内存上的有用数据+物理内存上的缓存数据
Q:windows的任务管理器里内存使用百分比是什么?
A:物理内存上的有用数据/物理内存,其实也就是物理内存上有用数据的百分比。
Q:linux/macos/ios上内存使用百分比是什么?
A:我好久没用了,但如果你看到常年接近100%的话,就是(物理内存上的有用数据+物理内存上的缓存数据)/物理内存,也就是真正的物理内存的利用率。
Q:缓存数据不算有用数据,那缓存数据有用吗?
A:有用。前面说到硬盘速度低于内存,而绝大部分数据都被持久化保持在硬盘上。
想要加快访问那部分数据怎么办?把它们搬到内存上。
可是内存掉电数据就丢了啊?那就把它们复制到内存上。
万一修改了数据呢?这就需要写回到硬盘上了。
Q:为什么任务管理器上内存占用高?
A:根据前面的说法,这意味着物理内存上有用数据比例比较高。
Q:为什么任务管理器上内存占用低?
A:根据前面的说法,这意味着物理内存上有用数据比例比较低。
Q:为什么缓存数据要那么多?
A:因为系统怎么可能准确知道你要访问什么数据嘛,换句话说这叫饱和式拷贝,缓存得越多,命中概率越大。
Q:为什么任务管理器上内存占用低?
A:看起来问题重复了,其实根据上一个解释就能有新的推断:
系统可能更喜欢缓存数据在物理内存里,而不是有用数据。
首先,程序申请的空间通常不会太大,就算很大,同一时间需要使用的也不会很大,这是往内存里放缓存数据的前提。
其次,缓存数据能提升磁盘访问的性能,这是缓存数据的意义。
然后,缓存数据一般都是未经修改的,和磁盘上内容同步,这意味着这部分数据丢了/抛弃了也没事,大不了再从磁盘上读回来。打个比方,需要打仗的时候,缓存数据能马上变成士兵(空闲空间)派上战场,而有用数据先要训练(写回或者保存到页面文件)才能变成士兵。
总结:多留点缓存数据在内存,既有提升IO性能,又能更好应对后续内存申请。
Q:还有什么原因吗?
A:可能跟休眠有关?休眠文件也在硬盘上,但可以理解为是物理内存上的有用数据的备份。
换句话说,物理内存上有用数据越多,休眠文件就越大。而写入休眠文件可能比较耗时还比较耗电,文件本身还占空间……
Q:为什么任务管理器上内存占用高?
A:这也是个老问题。建立在前面“系统可能更喜欢缓存数据在物理内存里”的推论基础上,如果现实却是有用数据在物理内存上占了更大比例,那说明什么?
考虑到页面文件有上限,数据不可能无限地往页面文件堆,所以可能原因是页面文件满了塞不下了,不得不放弃缓存数据来优先保证有用数据。
再考虑到有用数据虽然不是同一时刻都有用,但总还是有一大片数据是相对比较频繁被使用的。如果把他们放到页面文件上,使用时就会不断换入换出带来更巨大的开销,所以要优先保证这部分频繁使用的数据位于物理内存上,结果没想到这部分数据就把物理内存占得差不多了。
总而言之,就是物理内存不太够用,系统不得不放弃自己原有的追求。
Q:任务管理器的截图怎么解释?
![fb9d7f1eab7ebe3aa4b1ea83bcea9485.png](https://img-blog.csdnimg.cn/img_convert/fb9d7f1eab7ebe3aa4b1ea83bcea9485.png)
A:右上角32G,物理内存大小。
使用中15.4G,物理内存上的有用数据。已压缩4.4G,前面15.4G的一部分。
可用16.2G,约等于物理内存-物理内存上的有用数据(32-15.4~=16.2)
已提交43.3G,有用数据+缓存数据。46.5G,物理内存+页面文件。
已缓存5.7G,缓存数据。
分页缓冲池/非分页缓冲池,超纲了。
Q:资源监视器的截图怎么解释?
![6aae75389ab757720f4f54aeeca0e686.png](https://img-blog.csdnimg.cn/img_convert/6aae75389ab757720f4f54aeeca0e686.png)
A:正在使用16061M:物理内存上的有用数据。
可用16199M:约等于物理内存-物理内存上的有用数据(32768-16061~=16199)
可用10682M:物理内存上真正没被使用的空间
硬件保留142M:可能给核显了
已修改366M:缓存数据里被修改的部分。
备用5517M:缓存数据里没被修改的部分。
缓存5883M:缓存数据,也就是366+5517。
Q:RamMap截图怎么解释?
![df296d6a948603758607129c747b7d2f.png](https://img-blog.csdnimg.cn/img_convert/df296d6a948603758607129c747b7d2f.png)
A:饶了我吧,您都会用这个了还看我这个小白科普干啥……
后记:这不是严谨的技术讲解,而是科普向文章……看最后RamMap的截图就知道了,页表、页面缓冲池、共享空间这种就没考虑在内了。
当然我理解的也可能有误,欢迎在评论区提出相互交流。