今天闲来无事,看到360的内存加速球,想着探索一下其中的原理,于是知乎之,得到答案如下:
链接:https://www.zhihu.com/question/48612888/answer/111774710
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
内存以页为单位进行管理。内存页可以保存在内存中,也可以保存在本地的页面文件中。
所谓的内存清理,就是一个程序不停申请内存,从而不停的触发操作系统的内存重分配策略。直到用完系统可用的内存后再宣布释放内存,就把这些内存变成了空的状态。
在这个情况下,内存页的影响分以下几种:
1 当前程序正在使用的内存页:不动。
2 当前程序暂时并没有使用的内存页:写入硬盘的页面文件,并释放。如果当前程序要使用,就只能从页面文件再读回来。
3 IO的读缓存:删除。
4 IO的写缓存:写入完成后删除。
在Windows正常管理的情况下,对于前面的几种情况:
1 当前程序正在使用的内存页:不动。
2 当前程序暂时并没有使用的内存页:当有程序需要内存的时候,且3、4无法满足时,写入页面文件并标记为可以使用。但如果一直没有被使用。而当前程序又需要的时候,就可以直接再分配给这个程序。由于数据没有被清除,就不必再读一次硬盘。
3 IO的读缓存:不常用后,删除。
4 IO的写缓存:写入完成后删除。
所以结果是,只有两种情况下有效:
1 好看。
2 做好准备,为了用最快的速度迎接下一次大内存分配。比如你打算玩一个大型游戏,而想尽可能的加快载入时间,可以先做一次内存整理的动作。但实际上考虑到内存整理本身的时间,其实总时间就需要更多。
但是,就算你不人工触发内存整理的动作,当程序需要内存而当前没有可用内存的时候,操作系统自己就会按需触发内存重新分配的上述动作。
而由于放弃了读缓存,并强制写入暂时没有使用的内存页到硬盘,还在之后可能需要再从硬盘读回来,因此如果在内存整理后没有用完所有新释放的内存,这些额外的工作就毫无意义,只会拖慢速度我来尝试着举一个通俗点的例子吧。
电脑的内存就是市中心,原本大家工作得不亦乐乎。但市中心的地方终究是有限的,人多了总会住不下(内存不足),所以,那些最近不工作(不被使用)的就会搬到偏远的地方(硬盘上的页面文件)去住,反正不工作,住哪都一样。
现在清理软件来了,为了营造出都市很空旷闲适的感觉(内心很充足的错觉),就派了大批无关人士进来,把大家都赶了出去(内存移到页面文件)。
眼瞅着人都搬的差不多了(正在工作的总不能搬家),这些无关人士又凭空消失了(释放内存),所以城市就空旷了起来。
当然还有一种办法是直接关闭没什么卵用的公司(关闭无用程序),这样公司的员工就会消失从而腾出位置了。不过事实上并没有那么多不干正事的公司。
问题是,搬走的人可能只是休假一两天,马上就要回来工作。而连接市中心和边缘地区的交通是很差的(内存速度远高于硬盘),所以搬家就造成了交通堵塞,反而让大家上班迟到了!生产效率也下降了!
嗯,就是这样。
写于堵在路上的一辆从山里开往城里的公交车上。
作者:XZiar
链接:https://www.zhihu.com/question/48612888/answer/111913691
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。