IOS以及Mac os都是基于Unix/linux改造出来的,而在内存管理方面也沿用了Unix/Linux的内存管理机制。

下面主要说的是IOS系统,有很多比较喜欢捣鼓的吧友肯定自己清理过机器的内存,而装过内存清理软件比如内存优化大师、weestats插件什么的,一定会发现内存分成了四部分:可用空间、联动、活跃、非活跃。而多数人尤其是touch和ip4之前的小内存机型的吧友经常会惊呼,哇!可用空间这么小了啊!小内存机器就是不耐艹啊!

众所周知,CPU的处理速度和数据IO的速度是有数量级级别的差距的,而高速存储器的造价非常高,所以折中的做法是分级管理,CPU,二级缓存,内存,外存。速度依次递减。而在速度最慢的外存中,数据通常是以顺序存储的方式存储的,好处是方便顺序读取。好了,说到这里我要普及一个概念叫做局部性原理,就是在访问数据时,访问到这一个存储块的数据也很有可能访问到相邻下一个数据块的数据,因此在程序像CPU发出数据请求然后CPU发出指令把数据从外存调入内存时,Unix/Linux系统下的做法是把相邻若干个存储块的数据一起调入内存,这样就减少了将数据从外存调入内存的操作,可以大大提高IO速度。(UC浏览器用过吧,缓存下一页熟悉不?)

返回来再看我们的内存管理软件。可用空间,识字的都能看得懂,不说了。联动,是操作系统内核程序和数据,以及打开的程序,这个是肯定不能动的,不多说。活跃,就是最近做过访问以及读或者写操作的,换句话说就是程序现在正在用的。非活跃,重点来了,这就是根据局部性原理从外存中提前预读进来的数据,几乎所有的内存清理软件,都是在这上面做文章。前面说了,这部分数据提前预读进来是为了提高IO速度的,而多数内存清理软件为了造成可用空间变大,会释放这部分数据变成可用空间,看起来好像清爽很多,可是实际是这样么?再次引用局部性原理,这部分数据很有可能是程序接下来会用到的,你现在把他们释放了,过一会还需要从外存中调入进来,而这个过程是需要时间的。因此这样清理内存的做法,不但不会提高系统的速度,反而会拖慢速度。

怎么样看内存才是科学的呢?联动和活跃自然是不能动的,正确的做法是看非活跃数据是否很多,如果很多,不需要看可用了,你的内存还够用。如果你非活跃数据很少,那么看看可用空间,如果很多,好吧,这是你们看起来最顺眼的状态。而如果可用空间也很少,清理几个吃内存的deb插件吧,多数是美化的。各位,不要再小白了,非活跃内存不是垃圾!!!

其实我本人是很吐槽说内存不足以及有些人没事就清理内存这种做法的。为什么呢?简单地说,因为你手上的设备跑的不是windows系统,不需要沿用windows的使用习惯。windows系统和unix/linux系统是完全不同的,windows为了兼容古老和不规范的程序,允许程序直接控制硬件,而许多windows程序也不规范,因此在退出进程后往往许多内存没有还给系统,而又没有自己释放掉,因此变成了invisible memory,导致时间一长系统可用内存越来越少,此时便需要重启系统或者清理内存。

为了解释ios的后台机制,我需要再引用一个概念,就是进程挂起。挂起进程在操作系统中可以定义为暂时被淘汰出内存的进程,机器的资源是有限的,在资源不足的情况下,操作系统对在内存中的程序进行合理的安排,其中有的进程被暂时调离出内存,当条件允许的时候,会**作系统再次调回内存。而IOS下所有的后台程序都是挂起的,占用CPU么?不。占用内存么?也不。不同于windows,开一个窗口占一份内存,开的越多系统越卡。

ios内存详解的更多相关文章

  1. Java中堆内存和栈内存详解2

    Java中堆内存和栈内存详解   Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,ja ...

  2. 【转】IOS AutoLayout详解(三)用代码实现(附Demo下载)

    转载自:blog.csdn.net/hello_hwc IOS SDK详解 前言: 在开发的过程中,有时候创建View没办法通过Storyboard来进行,又需要AutoLayout,这时候用代码创建 ...

  3. Linux内存详解

    --Linux内存详解 -----------------2014/05/24 Linux的内存上表现的不像windows那么直观,本文准备详细的介绍一下Linux的内存. 请看这下有linux命令f ...

  4. JVM内存详解-阅读笔记

  5. Oracle内存详解之 Library cache 库缓冲

    Oracle内存详解之 Library cache 库缓冲 2017年11月09日 11:38:39 阅读数:410更多 个人分类: 体系结构 Library cache是Shared pool的一部 ...

  6. DDR3内存详解,存储器结构+时序+初始化过程

    DDR3内存详解,存储器结构+时序+初始化过程 标签: DDR3存储器博客 2017-06-17 16:10 1943人阅读 评论(1) 收藏 举报  分类: 硬件开发基础(2)  转自:http:/ ...

  7. NAND_FLASH_内存详解与读写寻址方式

    一.内存详解 NAND闪存阵列分为一系列128kB的区块(block),这些区块是 NAND器件中最小的可擦除实体.擦除一个区块就是把所有的位(bit)设置为"1"(而所有字节(b ...

  8. IOS SDK详解

    来源:http://blog.csdn.net/column/details/huangwenchen-ios-sdk.html?page=1#42803301 博客专栏>移动开发专栏>I ...

  9. iOS路由详解

    本文如题,路由详解,注定是一篇详细解释iOS路由原理及使用的文章,由于此时正在外地出差,无法详细一一写出,只能不定时的补充. 一.什么是iOS路由 路由一词来源于路由器,可以实现层级之间消息转发的功能 ...

随机推荐

  1. Linux入门 (笔记)

    Man can conquer nature. "人定胜天" 一.基本操作   1.重要快捷键 Tab 补全命令.目录.参数.文件名等 Ctrl+c 强制终止当前的程序 Ctrl+ ...

  2. 1109HTML学习

    <div><!--face里面用逗号隔开表示 字体优先选择.size是字体1到7 --><font color="red" face="微软 ...

  3. 关于Sublime text 2中Emmet的安装 _html:xt无效

    其实这个网上很多教程,有一些方法是可行的,但是有一些方法是行不通的. 虽然Sublime text 2有不同平台的版本,但是安装起来,还是有点差异的. 先简单介绍一下Emmet,Emmet是Zen-c ...

  4. WordPress插件制作笔记(一)---First Plugins Demo

    1->add_action  HOOK简单说明: http://codex.wordpress.org/Plugin_API/Action_Reference (参考网址) //在后台页脚位置加 ...

  5. R for installing package 'omg'

    The time i have tried to install the package named 'PODBC'  and it worked. But now i meet a problem ...

  6. 转:单片机C语言中的data,idata,xdata,pdata,code

    从数据存储类型来说,8051系列有片内.片外程序存储器,片内.片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code.data.xdata.idata以及根据51系列特点而设定的 ...

  7. 解决TextView与RadioGroup不对齐的问题

    TextView和RadioGroup是在同一个LinearLayout中的,控件摆放方式是android:orientation="horizontal",虽然三个控件是水平摆放 ...

  8. Smarty 插件开发

    插件包含了: functions modifiers block functions compiler functions prefilters postfilters outputfilters r ...

  9. 8.2.1.10 Nested-Loop Join Algorithms 嵌套循环 关联算法:

    8.2.1.10 Nested-Loop Join Algorithms 嵌套循环 关联算法: MySQL 执行关联在表之间使用一个嵌套循环算法或者变种 Nested-Loop Join Algori ...

  10. Activity — 4 launch mode

    launchMode在多个Activity跳转的过程中扮演着重要的角色,它可以决定是否生成新的Activity实例,是否重用已存在的Activity实例,是否和其他Activity实例公用一个task ...