最近身边用苹果的人越来越多,这是一件好事,我很高兴身边的朋友们都能用上世界上最先进的计算机和操作系统,但是大部分朋友都是从Windows过度过来的,从系统使用和原理理解上都有一些Windows的观念,最近很多朋友问我一个问题:“为什么我的系统一开机还没运行什么程序,空余内存就没多少了,我可是4GB内存啊,是不是有什么问题?”针对这一问题,特写此文,让大家理解基于UNIX的Mac OS X是如何管理内存的。

之前转载了一篇文章介绍Unix/Linux的内存管理,但是很多朋友说看不懂,那今天我就通俗的跟大家分享一下,Mac是如何管理内存的。

首先,我们要来了解一下,Mac OS X的内存四种状态,打开你的“应用程序-实用工具-系统监视器”程序,切换到“系统内存”标签,你会看到你的内存有联动、活跃、非活跃和可用空间四种状态:

见下图:

联动是系统核心占用的,永远不会从系统物理[内存]种清除,

活跃表示这些[内存]数据正在使用种,或者刚被使用过,

非活跃表示这些[内存]中的数据是有效的,但是最近没有被使用,

可用空间表示这些[内存]中的数据是无效的,这些空间可以随时被程序使用。

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

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

其实这就是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先进的系统架构和内存管理就决定了这个因素。

其实Unix的内存管理先进性仅仅只是Unix一个小小的细节,Unix还有很多很多比Windows先进的地方值得我们学习,以后我会为大家介绍更多的Unix/Linux特性。

Mac OS X / IOS 内存管理机制简要说明相关推荐

  1. iOS内存管理机制解析

    软件运行时会分配和使用设备的内存资源,因此,在软件开发的过程中,需要进行内存管理,以保证高效.快速的分配内存,并且在适当的时候释放和回收内存资源. 一.Objective-C内存管理的对象 IOS开发 ...

  2. iOS 内存管理机制与原理

    内存分区 内存一般分为五大区:栈区.堆区.常量区.全局区.代码区.如图 1.栈区 是由编译器自动分配并释放的,主要用来存储局部变量.函数的参数等,是一块连续的内存区域,遵循先进后出(FILO)原则.一 ...

  3. ios内存管理机制基础

    采用引用计数的方式来管理内存,分MRC和ARC两种,其中ARC是基于MRC的. 在MRC中, 每当我们使用alloc,new,retain,copy使对象的引用计数增加,都要对应的使用release或 ...

  4. 【OS学习笔记】三十 保护模式九:段页式内存管理机制概述

    上几篇文章学习了任务切换相关知识,如下: [OS学习笔记]二十六 保护模式八:任务门-任务切换 [OS学习笔记]二十七 保护模式八:任务切换的方法之----jmp与call的区别以及任务的中断嵌套 今 ...

  5. 从内存管理原理,窥探OS内存管理机制

    摘要:本文将从最简单的内存管理原理说起,带大家一起窥探OS的内存管理机制,由此熟悉底层的内存管理机制,写出高效的应用程序. 本文分享自华为云社区<探索OS的内存管理原理>,作者:元闰子 . ...

  6. 《深入解析 MAC OS X iOS 操作系统》PDF 带书签

    内容简介  · · · · · · <深入解析Mac OS X & iOS操作系统>编著者莱文. 系统开发者.内核黑客和对苹果感到好奇的人们注意了!本书探讨了MacOSX系统和iO ...

  7. iOS内存管理(ARC,MRC)

    iOS内存管理方式: ARC Automatic Reference Counting 自动引用计数 MRC Manual Reference Counting 手动引用计数 更改管理方式: 内存管理 ...

  8. iOS 开发:彻底理解 iOS 内存管理(MRC 篇)

    本文首发于我的个人博客:「程序员充电站」 文章链接:「传送门」 本文更新时间:2021年08月17日17:11:59 本文是 「iOS 开发:彻底理解 iOS 内存管理」系列的「MRC 篇」. 用来对 ...

  9. 【iOS沉思录】iOS内存管理试题总结与详解

    "iOS中的GC垃圾回收机制与内存管理机制以及block" 问题:僵尸对象.野指针.空指针分别指什么,有什么区别? 僵尸对象:一个OC对象引用计数为0被释放后就变成僵尸对象了,僵尸 ...

最新文章

  1. android采用MVP完整漫画APP、钉钉地图效果、功能完善的音乐播放器、仿QQ动态登录效果、触手app主页等源码...
  2. bootstrap datepicker Uncaught TypeError: Cannot call method 'split' of undefined问题
  3. IOS固定IP对动态IP用pre-share
  4. 关于nil和 null和NSNull的相关问题
  5. 【Linux 】使用 Shell 批量重命名文件名称
  6. 人不会一直寂寞,匿名社交也不会一直活跃?
  7. oracle 填入编号,sql – 带填充模式的Oracle to_char格式编号(FM0000)
  8. android mvvm框架搭建_轻松搭建基于JetPack组件的MVVM框架
  9. java在退出前释放资源_Java中如何通过try优雅地释放资源?
  10. g++ linux 编译开栈_方舟编译器编译hello world踩坑全记录
  11. 杭电OJ-2104_hide handkerchief超简洁代码
  12. ajax post 提交无法进入controller 请求200
  13. android9 关闭点击动画,在Android app中实现九(n)宫格图片连续滑动效果
  14. extjs 如何将局部的变量变为全局变量
  15. 内存条引发的各类故障解析
  16. 性能测试指标(重要)
  17. 哪里有全面的几何画板课件制作教程
  18. 苏大计算机考研专业课,苏州大学计算机考研初试经验分享
  19. 面向对象的英文全称叫做Object Oriented
  20. 其实创业做生意想成功,本质就两条:流量、变现

热门文章

  1. ReferenceError: XXX is not defined 错误及解决办法
  2. Spring的IoC理解,代码进行详解
  3. 光电编码器的原理及应用场合_图解编码器应用,推荐收藏
  4. 作为文本内容空格的HTML标签,HTML.fromHtml在文本末尾添加空格?
  5. usb3.0驱动linux,dwc3 linux usb3.0 driver架构
  6. 暴雪机器人消防_油库发生大规模爆炸?暴雪机器人、移动水炮、举高喷射车,消防高科技现身现场!...
  7. vimb java,我可以让vim接受\b而不是\lt;和\gt ;?
  8. dubbo调用超时回滚_如何处理Dubbo调用超时?
  9. linux 进程内存分布,linux C++ 的内存分布情况
  10. html5 drawimage参数,HTML canvas