为App申请更多的内存空间

4,967 阅读2分钟

前言

这是一个有争议的问题,用户巴不得使用的应用占用越小的内存越好。虽然现在国内android的设备内存越来越大。现在比较难再出现上古世纪的低内存kill问题。

本质

但非要获取更多也不是没办法。我们先从本质说起。首先在android中,每一台设备在/system/build.prop文件中就已经被标明了虚拟机最多被使用多少内存。如下:

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  

你可以使用在shell下你可以使用cat/vi命令打开它,来查看你自己的设备信息。注意需要su权限。

在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增加多进程,它不是必须的。

多进程带来的问题是应用之间通信的问题,即跨进程通信,目前市面上已经可用的框架解决。