测试机型:三星S3 台版 1GB Ram。和魅蓝有点近。本文转自其它论坛,为什么要转呢?因为我的下一个魅蓝优化教程要用到这里面的东西。各位魅友可以先来学习下。
在system/build.prop,原始三星S3的Dalvik虚拟机设定是这样子的:
1.dalvik.vm.heapstartsize=8m(表示应用程序启动后为其分配的初始大小为8m)
这里分配的内存容量会影响到整个系统对RAM的使用程度,和第一次使用应用程序时的流畅程序。
这个值越大,系统消耗RAM则越快,但是应用程序打开后的反应也越快。
值越小,系统的RAM剩余则越多,但是程序在启动后会比较慢。
2.dalvik.vm.heapgrowthlimit=64m(每个应用程序最大内存可分配到64m)
超过就会崩溃,退出该app...我猜没错的话
3.dalvik.vm.heapsize=256m(单个虚拟机可分配的最大内存256m)
这里分配的内存容量会影响到整个系统对RAM的使用程序,和程序在运行一段时间后的反应速度。这个值越大,系统消耗RAM则越快,但是程序会运行的非常稳 定,尤其是游戏和视频程序的内容加载速度可以大幅度提升。值越小,系统的RAM剩余则越多,但是程序会很卡,尤其是游戏在切换场景Loading的时候会 花费很多的时间。若应用程序需要使用超过这个值的内存时,将会触发系统的垃圾收集器,系统和程序就会卡顿。
用上面设定的话
每开启一只app,系统就会划出8m的动态内存给该程式使用,超过的部分会再+8m
共可以+7次8m,包含一开始划出的8m,总共64m,这是单一只程式的最大动态内存使用量
超过的话,该程式就会崩溃(自动结束掉)
单个虚拟机可分配的最大内存256m,意思是可以装满64m内存的程式X4
超过的部分就会对虚拟机内的程式强制回收内存,一方面要先强制关掉一些程式,一方面要加载程式划分新的内存,这时候就会出现卡卡卡、顿顿顿
因为每个人使用习惯不同,有时爱装一堆widget(小工具)在桌面上,单单摆在桌面上也不常使用他
也许单一widget只要3-5m,如果今天一开始就划分8m内存给他,对于一个常驻不到5M的程式
,就多浪费3M的内存,一般原厂rom闲置程序+后台程序就约30个,每个都浪费约3M内存
就将近浪费90M
所以我们可以将
1.dalvik.vm.heapstartsize=8m,改为=4M后重开机
光待机其况下你就会发现使用中内存变少了,可用内存变多了,虽然你在使用桌面小工具时候
可能不会比当初还要顺,因为系统还在帮该程式划分新的内存空间,但也不至于顿
2.dalvik.vm.heapgrowthlimit=64m不用改,现在的app在前景中都吃很大内存
若改小成32m,那假设程序内存要吃到40m才会够用,该程式可能就当给你看
3..dalvik.vm.heapsize=256m(单个虚拟机可分配的最大内存256m),虽然是写单个虚拟机,但系统到底会产生多少个虚拟机...我不确定,但唯一确定是不超过实际ram的可用量
记得S3虽然是配1G RAM,但实际上看到好像是780M吧(其他好像是GPU用掉了)
780/256=3...,大概就是3个虚拟机左右(应该是这样)
想要看到更多ram的人可以将256改为128m,重开机后...你会发现可用内存又变多了...
但一样,开启新程式时候要再+128划分新的虚拟机,速度可能慢一些,但不会顿,又可节省内存的不必要浪费
以上是牺牲一些开启速度,但可以减缓被系统强制回收内存的顿挫感
小弟我第一次打这么大篇瞎掰文,各位当作参考就好不要完全相信
关于root后修改build.prop当掉、死机、变砖,请不要晚上来找我~谢谢
懒人总结 S3 台版
1.想要装很多widget小工具到桌面的,推荐
dalvik.vm.heapstartsize=5m
dalvik.vm.heapgrowthlimit=40m
dalvik.vm.heapsize=160m
也许开启程式没那么快,但比较不卡顿,且可用内存会比较多
2.只要玩游戏、桌面很干净很无聊的、不安装其他widget小工具
dalvik.vm.heapstartsize=16m
dalvik.vm.heapgrowthlimit=64m
dalvik.vm.heapsize=384m
加载大型程式或游戏比较快,缺点是可用内存会比较小
S3 LTE (I9305)默认dalvik也是跟S3一样
但是可以改成(我也是这样设定)
dalvik.vm.heapstartsize=8m
dalvik.vm.heapgrowthlimit=64m
dalvik.vm.heapsize=576m(1750/576=3...)可以做出3个虚拟机。
(576/8)在8M以下的程式可以有72只闲置程式
(576/64)一个虚拟机可以容纳9只多工作。
//最后附上本人魅蓝使用的参数,回帖可见。
dalvik.vm.heapstartsize=8m
dalvik.vm.heapgrowthlimit=80m
dalvik.vm.heapsize=320m
dalvik.vm.heaptargetutilization=0.84
dalvik.vm.heapminfree=1m
dalvik.vm.heapmaxfree=8m
最后科普下:
dalvik.vm.heapstartsize
堆分配的初始大小,调整这个值会影响到应用的流畅性和整体ram消耗。这个值越小,系统ram消耗越慢,但是由于初始值较小,一些较大的应用需要扩张这个堆,从而引发gc和堆调整的策略,会应用反应更慢。相反,这个值越大系统ram消耗越快,但是程序更流畅。
dalvik.vm.heapgrowthlimit
极限堆大小,dvm heap是可增长的,但是正常情况下dvm heap的大小是不会超过dalvik.vm.heapgrowthlimit的值。如果受控的应用dvm heap size超过该值,则将引发oom。
dalvik.vm.heapsize
使用大堆时,极限堆大小。一旦dalvik heap size超过这个值,直接引发oom。在android开发中,如果要使用大堆,需要在manifest中指定android:largeHeap为true。这样dvm heap最大可达dalvik.vm.heapsize。
[dalvik.vm.heaptargetutilization]: [0.75] 可以设定内存利用率的百分比,当实际的利用率偏离这个百分比的时候,虚拟机会在GC的时候调整堆内存大小,让实际占用率向个百分比靠拢。
上面的几个参数是与虚拟机的内存分配相关的,虚拟机的内存分配过程是下面这样的:
1 首先判断一下需要申请的size是不是过大,如果申请的size超过了堆的最大限制,则转入步骤6
2 尝试分配,如果成功则返回,失败则转入步骤3
3 判断是否gc正在进行垃圾回收,如果正在进行则等待回收完成之后,尝试分配。如果成功则返回,失败则转入步骤4
4 自己启动gc进行垃圾回收,这里gcForMalloc的参数是false。所以不会回收软引用,回收完成后尝试分配,如果成功则返回,失败则转入步骤5
5 调用dvmHeapSourceAllocAndGrow尝试分配,这个函数会扩张堆。所以heap startup的时候可以给一个比较小的初始堆,实在不够用再调用它进行扩张
6 进入回收软引用阶段,这里gcForMalloc的参数是ture,所以需要回收软引用。然后调用dvmHeapSourceAllocAndGrow尝试分配,如果失败则抛出OOM。
好了,教程到这里结束了,如果你坚持看完了,你早晚会成为大神的:D。