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. 优化JavaScript脚本的性能

    循环 循环是很常用的一个控制结构,大部分东西要依靠它来完成,在JavaScript中,我们可以使用for(;;),while(),for(in)三种循环,事实上,这三种循环中for(in)的效率极差, ...

  2. Oracle数据库之PL/SQL程序设计基础

    PL/SQL程序设计基础 一.PL/SQL块结构 前边我们已经介绍了PL/SQL块的结构,再来回顾一下: DECLARE /* * 声明部分——定义常量.变量.复杂数据类型.游标.用户自定义异常 */ ...

  3. ecshop有关real_ip()你发现的问题

    我这边有一个ECSHOP后台,有一个功能,在客户下订单时自动获取客户IP,用的是ECSHOP本身的real_ip函数,但这个函数存在一个问题,十个订单得到的IP,可能会有几个与CNZZ统计得到的不一样 ...

  4. Jquery插件模版

    ;(function($){ $.fn.jcDate = function(options) { var defaults = { IcoClass : "jcDateIco", ...

  5. 获取MP3和M4A音乐文件的歌曲信息以及专辑图片--备用

    NSBundle* bundle = [NSBundle mainBundle];     NSString* path = [bundle bundlePath];     NSURL * file ...

  6. c#使用UIA进行模拟点击操作

    之前,我写过一篇c#使用spy进行模拟操作的文章,有朋友在留言中提到了UIA进行操作,今天也使用UIA重新实现一次对vnc窗体的控制测试. 实现目标 在server框内填入192.168.2.200 ...

  7. MySQL原生HA方案 – Fabric体验之旅

    http://www.csdn.net/article/2014-08-20/2821300

  8. ALTIUM DESIGNER怎么定义差分对布线

    方法一:第一步是在原理图中声明,这样做的目的是为了让差分对布线器清楚哪两个网络是属于同一组差分对,设计编译器将查找格式为NETNAME_N和NETNAME_P(即以_N和_P为后缀)的两个同名网络.这 ...

  9. Keil C51对同一端口的连续读取方法

    C语言是当前举世公认的高效简洁而又非常贴近硬件的编程语言之一.将C语言向单片机MCS-51上的移植始于2O世纪8O年代的中后期,经过近1O年的发展,C语言克服了产生代码过长.运行速度较慢的缺点,并且由 ...

  10. 64位平台C/C++开发注意事项(转载)

    转自http://coolshell.cn/articles/3512.html 在http://www.viva64.com/en/l/上例出了28个在64位平台上使用C/C++开发的注意事项,对于 ...