ios内存详解
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内存详解的更多相关文章
- Java中堆内存和栈内存详解2
Java中堆内存和栈内存详解 Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,ja ...
- 【转】IOS AutoLayout详解(三)用代码实现(附Demo下载)
转载自:blog.csdn.net/hello_hwc IOS SDK详解 前言: 在开发的过程中,有时候创建View没办法通过Storyboard来进行,又需要AutoLayout,这时候用代码创建 ...
- Linux内存详解
--Linux内存详解 -----------------2014/05/24 Linux的内存上表现的不像windows那么直观,本文准备详细的介绍一下Linux的内存. 请看这下有linux命令f ...
- JVM内存详解-阅读笔记
- Oracle内存详解之 Library cache 库缓冲
Oracle内存详解之 Library cache 库缓冲 2017年11月09日 11:38:39 阅读数:410更多 个人分类: 体系结构 Library cache是Shared pool的一部 ...
- DDR3内存详解,存储器结构+时序+初始化过程
DDR3内存详解,存储器结构+时序+初始化过程 标签: DDR3存储器博客 2017-06-17 16:10 1943人阅读 评论(1) 收藏 举报 分类: 硬件开发基础(2) 转自:http:/ ...
- NAND_FLASH_内存详解与读写寻址方式
一.内存详解 NAND闪存阵列分为一系列128kB的区块(block),这些区块是 NAND器件中最小的可擦除实体.擦除一个区块就是把所有的位(bit)设置为"1"(而所有字节(b ...
- IOS SDK详解
来源:http://blog.csdn.net/column/details/huangwenchen-ios-sdk.html?page=1#42803301 博客专栏>移动开发专栏>I ...
- iOS路由详解
本文如题,路由详解,注定是一篇详细解释iOS路由原理及使用的文章,由于此时正在外地出差,无法详细一一写出,只能不定时的补充. 一.什么是iOS路由 路由一词来源于路由器,可以实现层级之间消息转发的功能 ...
随机推荐
- vs code(egret wing) php配置与调试
所需插件 下面是便于编写以及调试php的插件,可以从IDE Store中搜索. PHP Debug,PHP IntelliSense,PHP IntelliSence Cranne. 环境配置 找到项 ...
- jquery1.9学习笔记 之选择器(基本元素二)
类选择器(".class") 描述: 选择所有与给出类匹配的元素 对于类选择器来说,jquery使用的是javascript原生的方法getElementByClassName() ...
- 父Prefab与子prefab问题
PrefabRevolution 原文:http://framebunker.com/blog/poor-mans-nested-prefabs/ (溜还是老外溜啊) 有些时候需要在Prefab里 ...
- Entity Framework with MySQL 学习笔记一(查看EF和SQL请求日志)
做数据库的一向来都会很注意请求的次数还有语句.这关系到很多性能的问题. 因此在使用EF的时候如果不了解原理很可能会搞出很糟糕的请求. 所以呢,在还没有搞懂EF前最基本的是你得"看得见&quo ...
- BZOJ 4407 于神之怒加强版
http://www.lydsy.com/JudgeOnline/problem.php?id=4407 题意: 给下N,M,K.求 思路: 来自:http://blog.csdn.net/ws_y ...
- Altium 9中正确的差分对走线方法
1.在原理图中定义差分对在菜单中Place>>Directive为差分网络放置差分对指令.差分对网络名称必须以“_N”和“_P”作为后辍.对差分网络放置指令后要对其参数进行配置,包括Dif ...
- Calling a Web API From a .NET Client (C#)
on|January 20, 2014 1760 of 2013 people found this helpful Print Download Completed Project This tut ...
- Mysql时间戳开始时间1970-01-01 00:00:00和PHP date慢8小时
mysql> select unix_timestamp('1970-01-01 00:00:01');+---------------------------------------+| un ...
- C# 创建Excel并写入内容
1 增加应用 Microsoft.Office.Interop.Excel 2 引用命名空间 using Excel = Microsoft.Office. ...
- 【转】Linux下tar.xz结尾的文件的解压方法
原文网址:http://blog.csdn.net/silvervi/article/details/6325698 今天尝试编译内核,下载到了一份tar.xz结尾的压缩文件,网上解决方法比较少,不过 ...