关于dalvik.vm.heapsize
文档原地址:http://wenku.baidu.com/view/8d77f9c6d5bbfd0a795673b3.html
智能手机硬件加速及虚拟内存利弊分析
1. debug.sf.hw=0,修改为debug.sf.hw=1,此步骤为打开硬件加速
2. dalvik.vm.heapsize=24m,修改为dalvik.vm.heapsize=32m,此步骤为修改虚拟机大小为32m
上面的第二点注意,这是修改 虚拟机内存,不是修改虚拟内存!! 这2者完全不同!
最近论坛里关于修改安卓系统2个参数的帖子很火,说修改后可以提升手机的性能。修改后有说好用的,也有说不好用的,好用的把楼主捧为了神,不好用的把楼主骂个半死,其实科学嘛,总有好处有坏处的,我们只要好好分析,就能得知我们为什么要改,还有修改后可以得到什么样的益处。捧别人为神或者踩别人为泥都对事情发展没有好处。
关于修改的内容,主要是修改2个参数:
debug.sf.hw=0,修改为debug.sf.hw=1,此步骤为打开硬件加速
dalvik.vm.heapsize=24m,修改为dalvik.vm.heapsize=32m,此步骤为修改虚拟机大小为32m
我来跟你解释这2个参数有什么作用,并且说说为什么我做ROM的时候不修改这2个参数。
1. dalvik.vm.heapsize=24m,修改为dalvik.vm.heapsize=32m,此步骤为修改虚拟机大小为32m
安卓系统 实际上,就是建立在 linux内核上的一个JAVA系统, 了解JAVA的同学应该知道, 在运行JAVA程序的时候,需要在每个程序上建立一个虚拟机, 以获得内存的分配,优点是假设某个程序崩溃了,系统只要关闭那个虚拟机就可以了,不会影响其他程序,缺点是很耗内存,因为你每开一个程序,就要新开一个虚拟机。
举个例子,打开程序A 的时候,程序A 就自动向系统申请1份虚拟机内存, 然后不关闭,再开一个程序B ,程序B要求向系统申请 3份内存, 假设虚拟机内存设置为24M ,那么这2个程序合共占用了内存 1X24 + 3X24 = 96M 。 假设虚拟机内存设置为 32M ,则这2个程序合共占用了内存 1X32 + 3X32 =128M
那么,究竟修改好,还是不修改好呢?
假设你的机子里,平常只运行一些小程序,例如QQ、看书软件、小游戏等,那么建议你不要修改,就使用标准的24M,因为足够用,并且防止运行程序过多,而产生崩溃。那是不是越小越好呢?当然不是,因为分配给程序的内存过小,有可能因为软件申请不到足够的内存,而运行不流畅。
假设平常经常运行大型程序,例如大型3D游戏等,则可以稍微调大一些,以使大型程序得到足够的内存来运行,可以更流畅。 那是不是越大越好呢,当然不是,因为调的太大,其他程序就分配不到内存,无法运行了。
google 为什么要把系统的虚拟机设置为24M 呢? 由于有些软件吃内存,也有一些小软件不吃内存,我觉得这是属于一个中庸的设计,由于没法全部偏向大型,也没法全部偏向小型,那就中庸吧。
我们都知道,华为C8650的机身内存 RAM 是256M ,这是固定的,给一个虚拟机用24M 还是 32M ,自己决定吧,不过,对于某些程序控,在手机里装一大堆需要开启服务的软件的筒子们,建议还是别改了,否则开机的时候需要启动一大堆程序,最后弄得机子都开不了。
我们来和常用的windows系统对比一下,假设同样有256M内存
windows系统的内存机制是:来了一个程序,程序告诉系统,我要100M ,然后来了第二个程序,第二个程序说,我要150M, 这个时候,内存已经被使用100M + 150M = 250M,剩余6M 。
然后来了第三个程序,第三个程序说,我要50M, 由于不够分给他,系统就崩溃了。
安卓系统的内存机制是: 来了一个程序,程序告诉系统,我要100M ,然后来了第二个程序,第二个程序说,我要150M, 这个时候,内存已经被使用100M + 150M = 250M,剩余6M 。
然后来了第三个程序,第三个程序说,我要50M, 这个时候系统自动关闭最先申请内存程序的虚拟机,或者最次要程序的虚拟机,他把第一个程序关闭了,系统获得了100M的内存,加上剩余的6M,合共106M,分配给第三个程序50M,系统继续运行。
第一个是 三个和尚,最后大家都没水吃
第二个是 牺牲小我,完成大我。
当然,系统在实际运用中,比上面复杂多了,例如安卓还加入了“隐藏机制”,只要不运行的程序,都自动马上释放内存, windows系统出现3个程序抢内存的情况,也加入了“等待机制”等,有兴趣的话可以自己研究。
转载一段 隔壁的论坛的文章: 《安卓的原理...不用在意内存的大小》 (以下全部都是转载)
不用在意剩余内存的大小。
其实很多人都是把使用其他系统的习惯带过来来了。android大多应用没有退出的设计其实是有道理的,这和系统对进程的调度机制有关系。如果你知道java,就能更清楚这机制了。其实和java的垃圾回收机制类似,系统有一个规则来回收内存。进行内存调度有个阀值,只有低于这个值系统才会按一个列表来关闭用户不需要的东西。当然这个值默认设置得很小,所以你会看到内存老在很少的数值徘徊。但事实上他并不影响速度。相反加快了下次启动应用的速度。这本来就是android标榜的优势之一,如果人为去关闭进程,没有太大必要。特别是自动关进程的软件。
到这里有人会说了,那为什么内存少的时候运行大型程序会慢呢?其实很简单,在内存剩余不多时打开大型程序,会触发系统自身的调进程调度策略,这是十分消耗系统资源的操作,特别是在一个程序频繁向系统申请内存的时候。这种情况下系统并不会关闭所有打开的进程,而是选择性关闭,频繁的调度自然会拖慢系统。所以,论坛上有个更改内存阀值的程序可以有一定改善。
但改动也可能带来一些问题,取决于值的设定。
那么,进程管理软件有无必要呢?有的。就是在运行大型程序之前,你可以手动关闭一些进程释放内存,可以显著的提高运行速度。但一些小程序,完全可交由系统自己管理。谈到这里,可能有的朋友会问,如果不关程序是不是会更耗电。我就说说android后台的原理,你就明白了。android的应用在被切换到后台时,它其实已经被暂停了,并不会消耗cpu资源,只保留了运行状态。所以为什么有的程序切出去重进会到主界面。但是,一个程序如果想要在后台处理些东西,如音乐播放,它就会开启一个服务。服务可在后台持续运行,所以在后台耗电的也只有带服务的应用了。这个在进程管理软件里能看到,标签是service。至于广播什么的我就不涉及了。所以没有带服务的应用在后台是完全不耗电的,没有必要关闭。这种设计本来就是一个非常好的设计,下次启动程序时,会更快,因为不需要读取界面资源,何必要关掉他们抹杀这个android的优点呢? 还有一个。为什么android一个应用看起来那么耗内存。大家知道,android上的应用是java,当然需要虚拟机,而android上的应用是带有独立虚拟机的,也就是每开一个应用就会打开一个独立的虚拟机。这样设计的原因是可以避免虚拟机崩溃导致整个系统崩溃,但代价就是需要更多内存。
以上这些设计确保了android的稳定性,正常情况下最多单个程序崩溃,但整个系统不会崩溃,也永远没有内存不足的提示出现。大家可能是被windows毒害得太深了,总想保留更多的内存,但实际上这并不一定会提升速度,相反却丧失了程序启动快的这一系统特色,很没必要。大家不妨按我说的习惯来用用这个系统。最后推荐一款进程管理软件,systempanel,market上能搜到,界面友好启动快,功能也不错,用于手动关闭进程很好的软件。
祝大家玩机愉快,这系统开十天半个月都没问题,不是windows。
以上内容均为转帖过来,至于为什么开了大程序或者开了好几个程序之后切换会变慢,我的理解如下
1.大程序A已经开启,占用70%内存,如果再想运行一个B,需要50%的内存,则就需要一个将A从内存中释放或者压缩的过程,所以表现出来的就是慢一会儿
2.A\B\C\D\E共占用内存80%,运行新程序Z需要20%的内存,系统内存因为没见过剩余0的时候,也就是应该剩一部分空闲内存,那么就需要从A~E这几个程序中选择一个或者几个来关闭,这一过程也需要耗费系统资源,所以会慢一会儿
3.也就是说你手动去杀程序的时候,就是替系统在释放内存,就算你不杀,在需要内存的时候系统也会自动释放。
4.不在后台运行的程序(没服务的),即使不杀也不会耗电。在后台运行的(有服务的)程序,如后台放歌,当然会耗电。
5.不是说杀进程没用,不然作者就不会推荐进程管理软件了。哪个带服务耗电哪个后台一直在运行,看服务就能看出来,这样的该杀。
6,以qq举例,正常的退,会在进程管理里留下qq的运行状态,但不耗电不占cpu,如果你只是切换出去(按小房子而不是退出)那么自然会耗电,因为程序还在运行。
第二个参数: debug.sf.hw=0,修改为debug.sf.hw=1,此步骤为打开硬件加速
首先,我要说明,这个世界上没有免费的午餐,假设通过那么简单的设置就可以提升性能,那厂商为什么不做呢?由此可知这个玩意实在效用有限,或者是需要和其他工具配合使用!
这个设置的作用到现在为止还没有一个标准的说法来说明这是用来干嘛的, 开启硬件加速? 开启什么硬件加速?
难道是3D性能? 难道不开启就没有3D性能吗?
开启CPU某些特殊性能? 这个也不靠谱啊!获取CPU性能关键看指令集!而且,为什么不一开始就使用呢?
开启其他硬件性能? 改了难道音箱变大声了? 改了难道30W像素的摄像头可以照500W了?改了难道内存由256M变成512M 了?
要么就是让CPU 一直保持100%性能的状态?那样性能是提升了,但是电池效果却下降了! (觉得这个解释还稍微靠谱一些)
我个人认为,这个设置的作用,目的是开启或者结束硬件厂商的优化指令,因为每个厂商对硬件的设置不一样,肯定在某些位置设置了一个优化指令,并且通过这个设置来开启。
例如,google 的工程设计标准里,设计了某个版本的手机设置标准是256M内存,并且告诉所有手机生产厂商:如果你是按照我的标准来制作,那么 debug.sf.hw= 就设置为0, 如果你要自己更改部分硬件设置,那么就设置为1 ,但是设置为 1 后,你得指向一个文件,告诉系统究竟修改了一些什么了。 某手机厂商为了手机速度更快,增加内存到512M,并且设置了一个文件,告诉系统,这个手机是用512M内存的,不是256M。
然后某个人开始使用带有优化指令的手机, 过了一段时间,又换了新手机后,发现配置接近,但是性能却不一样, 于是对比原来手机的文件,发现了这个指令,于是进行修改了,并且很有兴致的告诉别人,但是实际上,他用的新手机并没有设置优化指令啊,开启了以后等于没开启,甚至由于系统找不到优化指令,但是设置又告诉他有优化指令,弄得系统也不知所措,运行更慢,或者出现问题........
但是,由于这个人的“新发现”,弄得这个简单的 0和1 成为了一代传说(或者是一代流言)
特别声明: 红字部分仅为个人猜测。
由于手头资料有限,可能本人有错漏,欢迎指正。
有人说,现在所有的自制ROM都改了这2个参数了,其实,至少我的ROM从来都不改的,有兴趣可以用我的ROM研究一下。
分享到:
相关推荐
Dalvik虚拟机内存管理
Dalvik VM Instruction Formats
深入理解Android之dalvik.pdf
北航云计算公开课09 Mobile Phone and Android Dalvik.pdf
这是一个替换系统属性“ ro.dalvik.vm.native.bridge”以注入合子进程的示例。 我已经在我的Google Pixel 3(Android 10,Magisk 20.4)上对其进行了测试,它似乎运行良好; 但是它可能不兼容所有设备,如果要使用...
Android虚拟机Dalvik完整源码
Soruce code for MIPS version implemetation
android虚拟机内部原理剖析。。 深入浅出,值得一看
NULL 博文链接:https://mysuperbaby.iteye.com/blog/1392516
Android_Dalvik_VM_Internals_Google__
解析DEX文件的指令列表时需要用到。 此文档出处是android2.3.7源码。
dalvik源码离线帮助文档,全套的,方便对照查询,有些小伙伴可能不会下载,这里就分享一下
包含dalvik.system.VMRuntime这个类
Android平台的Dalvik虚拟机内部机制介绍,googl自己的ppt哟!
Dalvik VM——Research and Implement on Elastos.ppt
介紹 Android Dalvik VM 的相關知識. Interpreter Switch dispatch Direct call threading interpreter Direct threading The context problem (HW architecture / branch perdition) Subroutine threading Let's ...
Android Dalvik 虚拟机 分析, 巴基斯坦人写的。
A Java-language API for doing compile time or runtime code generation targeting the Dalvik VM. Unlike cglib or ASM, this library creates Dalvik .dex files instead of Java .class files. It has a small,...
AndroidRuntime: java.lang.UnsatisfiedLinkError: Couldn’t load airtalkee from loader dalvik.system.PathClassLoader[DexPathList[[zip file “/system/app/POCM3A.apk”, zip file “/data/data/com.cmccpo