前言
这是一个有争议的问题,用户巴不得使用的应用占用越小的内存越好.虽然现在国内 android 的设备内存越来越大.现在比较难再出现上古世纪的低内存 kill 问题.
本质
但非要获取更多也不是没办法.我们先从本质说起.首先在 android 中,每一台设备在 / system/build.prop 文件中就已经被标明了虚拟机最多被使用多少内存.如下:
你可以使用在 shell 下你可以使用 cat/vi 命令打开它,来查看你自己的设备信息.注意需要 su 权限.
dalvik.vm.heapstartsize=16m
dalvik.vm.heapgrowthlimit=192m
dalvik.vm.heapsize=512m
dalvik.vm.heaptargetutilization=0.75
dalvik.vm.heapminfree=512k
dalvik.vm.heapmaxfree=8m
在 android 中一个进程属于一个虚拟机,那么虚拟机在 android 中是动态分配内存的.这里有三个关键信息值得注意:
1.heapstartsize 是指应用刚被启动时的内存大小.
2.heapgrowthlimit 是指动态分配的最多内存大小.
3.heapsize 是指应用配置了 largeHeap 属性后可用最大空间. (超过该值会 OOM)
我们得到一个结论,在设备上如果我们需要更大的内存空间就需要在应用中配置 android:largeHeap 为 true.
查看应用内存配分情况:
shell 下输入:
dumpsys meminfo - a包名称
会产生以下几个疑问:
1.heapsize 的最大值为 512m,如果我需要开销 1024m 怎么办?
2. 如果是动态分配,那其它应用把内存都抢光了呢?
怎么解决:
通过分析,发现国内的超级 app 都已经在用的一个办法,就是把应用做成多进程的.有时一个 app 多达三四个进程已经是很常见的事情了.感兴趣可以自己去看一下进程表.
多进程的应用怎么去写,和进程间通信怎么使用不是本文的讨论范围内,我们只说申请更多内存.在本质上一个 android 应用就是一个或多个进程在不同的虚拟机中运行,而一个进程就对应着自己的一个虚拟机.那么 rom 厂商给定的限制是单个虚拟机最大内存配置.如果我们是多进程就等于是多个虚拟机.自然也就获取了更多的内存分配.
什么时候用?
当我们只有一个进程的时候,某个组件中或页面中突然需要开辟大量内存空间.表现的情况为卡顿,掉帧,OOM 等.(因为在动态分配内存和释放无用的资源)
常见具体场景有:
webView 独立进程,多媒体播放独立进程,IO 读写,推送服务,长链接服务等
注意:
不需要刻意给 App 增加多进程,它不是必须的.
多进程带来的问题是应用之间通信的问题,即跨进程通信,目前市面上已经可用的框架解决.
来源: https://juejin.im/post/5a5418506fb9a01c9405b4c5