最近看一个开源项目 发现它定义了android:largeHeap。之前没接触过,就做点笔记记录一下。
先看一下一些跟这篇文章相关的一些基础概念
手机内存、cup是固定的。随着市场的app数量的不断增加,我们要保证自己的app能稳定运行,我们需要格外注意app的性能。android会公平地为每一个app分配一个可用的内存,不管现在手机的空闲内存是否多,就算整个手机只有你一个app,也不会允许你肆意地把所有内存都占用掉。
这里面有几个关键名词
- heapstartsize(堆分配的初始大小)
- heapgrowthlimit(单个应用程序最大内存限制)
- heapsize(单个java虚拟机最大的内存限制)
这些指标的大小跟机型有关系
例如我的红米4note的heapgrowthlimit是256M
如何查?(这里要注意的是shell 命令必须要加 “”)
查看单个应用程序最大内存限制: adb shell "getprop|grep heapgrowthlimit"
这些指标如何体现?
从上图可知:
app使用过程中需要给对象分配内存,则先会去看,现在是否有足够的内存,如果内存不够,先触发内存回收GC(Garbage Collection)操作,释放的无用的对象内存之后,如果内存还不够,系统才会给app增加内存分配,那么,增加多少内存,这个值要受到目标内存利用率的影响。
那么app的内存可以无限制增长吗?当然不可能。app的内存最大值,默认情况下,就是前面所说的单个应用程序最大内存限制(heapgrowthlimit),但是系统给了一定的扩展空间,开发者可以在manifest文件中增加 android:largeHeap="true" 这个语句,就可扩展这个最大值。如果app使用过程中占用的内存超过这个最大值,就会发生OOM,导致app闪退。
最后结论
通过清单文件中的 largeheap=true可以申请到更大的堆内存,但在一些严格限制的机型上,不一定有效。
网友评论