首先,我们要来了解一下,Mac OS X的内存3种分类,打开你的“应用程序-实用工具-系统监视器”程序,切换到“系统内存”标签,你会看到你的内存有已使用内存、已缓存文件、已使用交换3种分类:

见下图:

而已使用内存又分为三个模块:

  • APP内存就是应用使用的内存
  • 联动内存是系统消耗的内存,是系统核心占用的,永远不会从系统物理[内存]种清除
  • 被压缩是类似于虚拟内存的方式存贮一些不是立刻需要的内存(但是实际上还是放在内存上增加存储效率,只是目的和虚拟内存相似)

剩下的就是已缓存的文件和已使用的交换,这二者有点类似于傲腾内存和大名鼎鼎的Superfetch服务(磁盘100%读写杀手)。前者是利用其高读取和写入速度实现对你打开APP的预判(提前把APP载入内存以增加APP载入速度),后者是提前预判你需要的文件提前加载入内存从而降低打开时间,二者其实都是为了提升系统流畅度服务。

当可用空间的[内存]低于某个值(这个值是由你的物理[内存]大小决定的),系统则会按照以下顺序使用非活跃的资源。首先如果非活跃的数据最近被调用了,系统会把它们的状态改变成活跃,并接在原有活跃[内存]逻辑地址的后面, 如果非活跃的[内存]数据最近没有被使用过,但是曾经被更改过而还没有在硬盘的相应虚拟[内存]中做修改,系统会对相应硬盘的虚拟[内存]做修改,并把这部分物理[内存]释放为可用空间供程序使用。如果非活跃[内存]中得数据被在映射到硬盘后再没有被更改过,则直接释放成可用空间。最后如果活跃的[内存]一段时间没有被使用,会被暂时改变状态为非活跃。

所以说,如果你的系统里有少量的可用空间内存和大量的非活跃的内存,说明你的[内存]是够用的,系统运行在最佳状态,只要需要,系统就会使用它们,不用担心。而反之如果系统的可用空间内存和非活跃内存都很少,而活跃内存很多,说明你的[内存]不够了。当然一开机,大部分[内存]都是可用空间,这时系统反而不在最佳状态,因为很多数据都需要从硬盘调用,速度反而慢了。

其实这就是Unix的内存管理方式,我们大家都知道,内存的速度是比硬盘快得多的,那么UNIX的内存管理机制就是尽可能多的使用你的物理内存,当你没有打开程序的时候,系统自动会把一些系统常用的资源从硬盘加载到内存,当你开始执行操作需要调用这些资源的时候,系统就不会从硬盘去读取你的资料了,而是直接从内存读取(专业术语叫命中),这样就提高你的系统速度,不浪费你的物理内存资源。

Mac系统基于UNIX系统,继承了UNIX这一内存管理机制并且进行一定的优化,Mac的内存管理具有UNIX的特征的同时,Mac还会记录你最常用的程序,然后在你内存有足够空余资源的时候,就把这些程序主要模块(Modlue)加载到内存,当你开启这个应用的时候,程序就快速启动了,当你关掉这个程序界面(Command+W / iOS-Home)的时候,大部分程序并不会真正的退出(quit)系统,而是保留程序核心模块驻留系统内存,你可以在Dock上看到图标下有个小亮点(iOS连按Home),当你下一次需要使用的时候,只要点一下程序就快速启动了,如果你很久没有再用这个程序而打开了其他程序,而打开了其他很多程序,那么系统就会在内存不够用得时候,自动把你只是关闭没有退出(Command+W)的程序驻留内存文件转移到硬盘的某个地方(pagefiles)中,等待你的调用,只有当你完全退出程序(Command+Q)的时候,这些程序就从内存清除了,但是Mac系统会智能的学习和了解你的你操作习惯,不断的更换你的常用程序列表,然后当物理内存有空的时候随时把你常用的程序模块载入内存,等待你调用。其实这也是Mac系统为什么点按窗户红色按钮是关闭而不是退出的设计思维原理,就是让程序在下一次被用户打开时能够快速启动,而且先进的Unix内存管理计算方式几乎不用你去担心是否内存不够用了,需要退出这些打开的程序,因为系统会习惯出一个最佳值什么时候释放内存(哪些内存数据什么时候保存到pagefiles去)来保证你的系统运行效率,尤其是现在很多iOS设备用户,每次都喜欢按Home返回后再连按Home去退出程序,其实完全没必要这么做,因为iOS是Mac OS的移动版,具有和Mac OS X完全相同并且高效的内存管理机制,你每次运行了程序再去退出他,反而降低了你系统下一次开启这个程序的速度。

windows为了兼容古老和不规范的程序,允许程序直接控制硬件,导致windows系统的权力不够大,而许多windows程序也不规范,因此在退出进程后往往许多[内存]没有还给系统变成了invisible memory,导致时间一长系统可用[内存]越来越少。因此常常需要重新启动。而且Windows在内存管理方面也于Unix有很大的区别,由于我对Windows并不是很熟悉,所以只能以我自己的理解来向大家说明,如有错误,还请斧正。由于Windows的系统模块链接关系不明确,权限又很混乱(Windows貌似压根就没有文件权限这个说法),导致后来Windows98就经常蓝屏死机,又为了防止大量不规范程序退出后不归还系统内存,所以Windows就只能在系统启动完毕,加载完必要模块后,当用户请求一个程序就从硬盘调用一个,不用就清除的办法来管理内存,所以如此就造成了系统物理内存的大量浪费,因为我们并不是随时都需要运行超级大的程序,事实上,大部分人的电脑都有4GB内存,而通常只开一个QQ和一个浏览器,顶多在打开一个Music Player,所占内存不到200MB,加上系统内存最对也就1GB左右,至少一台4GB内存的计算运行Windows的话,有75%的时间内存使用不到2GB,那么也就是说用户花了4GB的钱,其实浪费掉了75%,比如花了400元,你就浪费了300元,但是用UNIX就不会浪费你的钱,因为Unix先进的系统架构和内存管理就决定了这个因素。


什么是虚拟内存?

macos运行应用时,使用内存分为实际内存和虚拟内存,实际内存则为运行的内存,用于实时计算。虚拟内存着为硬盘划分出来的部分内存,用于存放过往的计算结果。

在应用运行的过程中,系统会为应用程序分配此刻所需的实际内存,把过往运行的结果保存到虚拟内存。例如运行一个photoshop,如果同时打开10个大型文件,每个大型文件为1g,那么系统会为当前工作中的文件分配1g内存,剩下的9个文件均会使用虚拟内存保存起来,无论你的mac是16g还是8g,这个原则不会改变。

再例如你打开10个网页,每个网页需500m内存, 系统会根据浏览器分配所需的实际内存,而网页由于是静态的,因此都被保存到虚拟内存,但是加载中的网页会分配为实际内存。以chrome为例,假设chrome需200m运行,而在chrome里面开启20个静态页面,每个页面所需200m内存,那么chrome实际上占用内存为200+当前网页200=400,而其他已加载完成的网页会分配到虚拟内存里面去(约占7g虚拟内存)。无论你的mac是8g或16g,该原则不会改变。

而如果你同时打开20个网页,并且网页中正在播放视频,那么此刻所需的实际内存等于每个视频缓冲大小,约等于20*20=400,再加上chrome本身所需的实际内存200,此刻chrome占用实际内存为600,而已缓冲的视频片段会分配到虚拟内存。

当实际内存分配完毕时,内存则发出警告。在以上基础,如果忽略cpu及gpu 的性能,那么8g内存理论上可以同时运行相当多的视频网页及应用程序。但是由于cpu和gpu性能有限,无法同时承载过多数据,因此会卡顿。

大多数情况下,如果你同时开启几十个应用程序,如qq、微信、邮箱、短信、现场、笔记本等,内存始终保持在6-7g至今,而当你把所有应用程序都关闭,你发现内存依然在5-6g之间。原因是这些内存数据并不表示实际的内存分配,它还包含了虚拟内存部分。

大型软件工程,大型音乐创作、大型视频创作、实验室模拟量子发生器,大型设计渲染。而且这些工作在执行过程,无法使用虚拟内存,只能分配实际内存。

量子模拟器,所需实际内存大小相等于模拟过程持续时长及单次计算结果的大小。通常大于8g。实验室用的量子模拟器通常高度依赖实际内存,但是实际内存被耗尽之后,依然会使用虚拟内存代替,但是模拟过程会变慢。

参考链接:

http://www.360doc.com/content/15/0121/09/10135992_442481321.shtml

https://tieba.baidu.com/p/7864991061

https://zhuanlan.zhihu.com/p/343321358