【转】为什么iPhone4到iPhone4S坚持使用512MB内存?
内容大概:&
1、iPhone内存情况概述&
2、可用内存&
3、空闲内存以及释放内存的原理以及弊端&
4、虚拟内存&
iPhone内存情况概述&
废话不说,直接入题。&
大家都知道iPhone4只有512m内存,运行多个程序就常常不大够用
安卓已经是1G内存了,因此可用内存和虚拟内存一直都是大家比较关心的。下面我就来就大家的一些疑问发表一下我的看法。&
首先,iPhone4的内存是这样的,与电脑不同,是集成到a4处理器内部的。a4处理器一共有三层,包括1层是cpu,gpu,内存控制,高速缓存等一堆乱七八糟的东西,然后剩下两层就是内存,也叫ram。可能当时ipad1的a4太多了,或者由于大量生产价格低,因此itouch使用的就是ipad1用的a4(有拆解为证),也就只有256m的ram了。iphone4使用的也是a4,但是型号是不一样的,有人测定iphone4的处理性能会比itouch4差一点。&
除此之外,大家还要注意,iPhone的内存是很多功能模块共用的,512m的ram要提供给cpu,同时还要提供gpu的显存,flash的缓存还有ramdisk。cpu也就是系统分得的部分再去掉系统进程占用的,最后留给用户的其实不多,一般来讲,可用内存300m左右时正常的。
由此可见,大家不要想在硬件上加内存了,除非换掉a4。&
接下来是关于可用内存的一些问题。大家一定要分清楚可用内存和空闲内存的关系。&
空闲内存指的是当前已经被系统标记为空闲的部分,这里面没有存放任何有用的数据。&
而可用内存指的是当进程申请的时候可以提供的最大内存,包括一些不太重要的进程占有的或者是一些可有可无的部分也算在内。&
当你的前台进程请求的时候,系统会先提供空闲的,如果不够用了再释放那些不重要的给前台进程用。有时候系统不希望某进程占用太多的内存,回复的可用内存也不会太高。但是随着前台进程占用的越来越多,系统还是会尽量提供的。因此最开始显示的可用内存完全有可能被突破。&
就象你请客,告诉别人你可以接受的肯定不是你家房子实际容量的极限,假如你家使劲挤可以挤进去20个人,但是你可能会告诉他们我只能接受10人。但真的来了13个人的时候,难道你就真的拒绝那3个吗?肯定要让他们进来嘛!&
因此,大家不要过于在意那个可用内存,更不用在意那个空闲内存的大小。&
对于sbsetting里的状态栏可用内存,我还是建议大家开着。但是,注意,它显示的是系统告诉他的可用内存。而sbsetting的用户是root,也就相当于是你家亲戚。你告诉亲戚和愿意提供给亲戚的空间肯定比外人,也就是mobile用户的进程(普通应用程序的都是)的高嘛,因此sbsetting显示的可用内存比一般应用程序的要高。我们一般无需在意,但是你要是发现它变成了个位数,还是赶快保存吧,房子可能真的要挤爆了。&
对于空闲内存而言,说实话我还希望它小一点。为什么呢?你说它空在那里耗电有意义吗?还不如让他存点东西呢!其实系统就是这么做的。他会将一些可能会用到的硬盘(其实应当叫flash)里面的一些内容先放在这里,到时使用时候就会快。由于这里面的东西不重要,到时进程需要直接可以给他。&
大家有一个误区:在内存里,删除原本的数据非常简单,只需要将要删除的区块状态标记为空闲就可以了,不用改内部数据,几乎不要时间,并非我们想的非要用橡皮擦擦干净才能用,所以,使用当前空闲的内存缓存外存数据,这么做是很明智的。同时,这一部分会被标记为不活动。当你们用软件释放内存的时候,会发现不活动这一部分几乎全部被释放。&
释放内存的原理以及弊端
其实释放内存的原理就是这个进程不断的请求并且增大占用的内存,到达最大时突然删除全部自身占用部分是的内存之中出现大量空闲内存达到的。由于sbsetting是root用户的,springboard是mobile用户的,所以用sbsetting释放有时会将springboard的释放掉甚至结束springboard导致注销,而使用ipa格式***的内存优化软件不会。&
由于释放内存会将之前缓存到ram里面的外存盘数据删除,当再次使用他们的时候需要重新从低速的flash里面加载,这也就是为什么释放内存之后滑倒搜索页面会卡,但是你多弄几次就好了的缘故,也就是说,我们没必要去释放内存,到时程序不够了系统会释放的。&
一般来说,动不动就释放只会导致更慢和更卡。&
而且为了省电和减少cpu使用和外存通道的占用,将外存盘内容转存到ram是如同蚂蚁搬家极其缓慢的进行的,人家搬来其实很不容易的,也体谅一下他们嘛!&
当然也有人发现释放之后更快了,什么原因呢?&
可能是由于之前你使用的时候由于需要加载了很多服务,尤其是依赖mobilesubstrate之类的,在你不再使用的时候,他们没有被清理掉,而是继续占有内存甚至继续运行,主要是占用cpu导致的。&
举个明显的例子,当你结束掉全部可以结束的进程的时候,开个游戏,当你退出的时候,有时会发现音乐进程竟然是开着的,也就是这个道理。而主要导致这个问题的就是越狱后***的依赖mobilesubstrate的插件。这些插件的原理是动态替换内存里面的数据,不会出现新的进程,全部是包在了springboard这个进程里面的。所以当你发现springboard的内存占用很多并且cpu使用率很高时,可以考虑注销或者释放内存了。&
额,不早了,最后说一说虚拟内存吧。我知道这是个不受好评的东东,本人之前一直非常感兴趣,能找到的不管系统是否对应都试过,因此也算有发言权吧。&
虚拟内存就是将物理内存中一些不活动的页面搬运到外存(就是硬盘或者flash)中,为当前活动的腾出空间,同时让进程以为自己拥有连续可用内存的这么一项技术。&
我们当前***的那些虚拟内存deb沿用的是windows上面的方案,导致系统不稳定的最大原因是与原生的虚拟内存技术冲突。我可以很负责地告诉你,iOS绝对有虚拟内存。&
第一:在iOS4的发布会(好像是)上,乔布斯展示了这么一张幻灯片,上面写着limited memory,have
virtual memory, no
swapfiles。相信大家都知道是什么意思吧,不解释了。同时也说明苹果使用的是完全不同的虚拟内存方式。&
第二:亲身体验。当你开了一堆后台时候,转到第一个你开的,你会发现立刻使用的话貌似卡住了,过了几秒钟又好了,如果用multiflow的话甚至貌似退回了主界面,过一会也好了。你有没有发现这个现象和你在windows上面开一堆程序然后点开最早开的那个有点像?说明了什么?只不过苹果更愿意全部加载完再呈现罢了。而使用原生后台时候卡住的那个界面其实就是个截屏而已,在你按下home时候截的,此时系统正在将在flash上面的内存部分转移到ram上面,而flash比内存慢多了,于是就要等待,此时并没有卡机或者死机。&
当你开了一堆网页时候,回去前面的(是换页面不是后退),你会发现貌似要重新打开,这确实是内存不足的缘故。但是,如果你仔细观察,会发现其实页面并没有刷新(在威风回复的时候非常明显,怎么重新加载完后这帖子还在这里??),如果此时刚好断网(很少见,但我在学校经常遇到),丝毫没有影响。说明什么?&
其实,iOS4自己就有虚拟内存,而且更先进。&
第一,它只转移普通应用程序的,不会动系统进程占用的内存(你可以在释放之后去看,减少的几乎全是应用程序的,系统进程占用的几乎不变),使得系统跟稳定,速度不受影响。&
第二,扫出去的内存数据存放是分散的,我估计是在各自应用程序文件夹tempfile里面,这样不会出现像虚拟内存deb导致的对flash某个区块频繁写入,寿命下降这种问题。&
这也是为什么原生后台是暂停程序的一大原因--不活动内存的更容易也更有必要被扫入flash中,而对于大部分应用而言,它在后台运不运行对我们真的没有影响。&
至于虚拟内存deb与自带的虚拟内存冲突的具体原因,据我分析是这样的。&
第一,同时调用dynamicpager做不同的事,因为扫入方式路径不同,这个没什么好说的。&
第二,虚拟内存deb不会分是系统还是用户只要不运行通通扫入flash。用户部分其实没有影响,关键是系统部分。由于设计的它们是不会被扫入的,因此当其突然需要某部分时候,由于flash速度慢,其不能立刻加载,而此时系统不会让其等待,而是误以为出现错误,于是结束此进程。这也就是springboard崩溃进入安全模式的原因。也是偶然出现某些功能无法使用,比如中文输入的原因。同时,也可以解释为什么在老机器,如一代,二代上面使用稳定度很高,象我的itouch1,因为这些机器处理本来就慢,而flash速度没太大区别,等待不会太久。同时还有系统版本缘故。之前单任务ram会不够嘛?估计这个也是iOS4之后才正式启用的。当然,还有个原因,那些老机器本来就不稳定了,不用虚拟内存也经常会进安全模式的,用了大不了就多进几次咯,区别也不会大的。嘿嘿!&
所以我的建议就是,一代二代还是可以考虑虚拟内存deb,三代四代就不要用了,尽情享受系统原生的虚拟内存吧!&
这次就先到这里吧,我眼皮也打架了。看在这份上,大家还是尽量回复一下吧。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。查看:9375|回复:1
好久没写教程了,N年了!
其实今晚也是热血高潮,换4s回来也有1个多月,平常就丢在电脑桌,没啥事,想了想,就拿来做下实验吧!
本来嘛,iphone就是一台电脑,买回来就为了打***发短信,他哥的这不是浪费吗?有iphone的执行权限,我们想做什么又不行?只有能执行shell命令,通杀啦!
让我来剥iphone 4s的皮给大家看,展现iphone的强大之处!
--------------------------
作者:black world
1:手机要越狱
2:已***Cydia
(为了方便大家观看,我使用openSSH连接到手机,然后在电脑端操作,如果是在手机操作,那可以下载***mobile Terminal 执行命令,跟以下操作一样)
go~~~~~~~~~~~~~
进入Cydia搜索*** openssh
下载***好openssh后,我们在电脑端下载putty ,ssh连接到iphone手机(putty自己去下载)
好,现在我们连接进去(现在演示的IP地址是我这边的地址,手机的上网IP地址跟大家的不一样,大家自己查,然后换成你自己的手机IP地址就好了,这里不多说了)
输入用户名:root
密码:alpine (iphone默认的密码,我们输入的时候屏幕是不显示的,我们输入完安回车键)
我们先查看一下iphone的根目录
iphone中***程序的目录:
/var/mobile/Applications
相册目录:
var/mobile/Media/DCIM/100APPLE
我们进入***目录看看:
cd /var/mobile/Applications
我们在命令行查看***文件目录的时候是无法看到中文的名字的,当然iphone***程序名字是这样的命名方式,我们可以用ifile工具来查看,对比一下看!
看到了吧,大家可以在命令行上操作任何东西,手机上无法操作的,命令行下都可以,好了,我们重点不是这些,我们现在clear清除一下,接下来我们***gcc,编译c++的程序,本来嘛,iphone就是一台电脑,买回来就为了打***发短信,他哥的这不是浪费吗?有iphone的执行权限,我们想装什么又不行?只有能执行shell命令,通杀啦!
1 下载libgcc
命令行输入:
如果没有***wget,请到Cydia搜索***,图
2 ***libgcc
命令行输入:
dpkg -i fake-libgcc_1.0_iphoneos-arm.deb
3. ***iphone-gcc(如果apt没有***,大家可以到Cydia搜索***)
命令行输入:
sudo apt-get install iphone-gcc
命令提示输入Y确定
4.***sdk头文件,我这里装的是2.0
当然,我们来解压一下,因为我们下的是压缩包
命令行输入:
tar -xvzf sdk-2.0-headers.tar.gz
现在我们进入刚解压的sdk头文件目录
cd include-2.0-sdk-ready-for-iphone
复制include-2.0-sdk-ready-for-iphone文件到include目录
cp -r * /usr/include
当然你移动也可以,目的就是把这目录文件放到/usr/include目录下,好了,这边做好,我们在回到根目录!
5.下载gccwget
tar -xvzf gcc_files.tar.gz
cd gcc_files/
好了,差不多了, 为了安全起见,我们再装个ldid吧,这是为什么捏?当然是为了防止iphone kill掉但我们程序!来继续
命令行输入:
apt-get install ldid(这个之前我***过了)
-------------------------------------------------------------------------------------------
大体都按装好gcc了,我们测试一下
对了,再***个命令行编辑器吧,vi 或者nano,这样可以直接在命令行编辑!
编写代码(保存为black.c),随便写个简单的程序:
#include &stdio.h&
int main()
printf(&hello,this's the black black world......\n&);
然后我们gcc编译black.c文件(gccblack.c -o black)
ok,成功编译运行!
附手机终端运行结果图
好了先写到这里,太困了!
本帖最后由 hack18 于
06:14 编辑