前段时间遇到一个棘手的问题。就是系统崩溃,app卡死,一看 log。oh, my god!一堆的 lowmemorykiller 消息,dumpsys meminfo出来看一下
好家伙,我直接好家伙。4G 内存差不多直接被吃了(Lost RAM)2G,芯片厂商是真的狠,只剩下(Free RAM)400多M,这怎么玩,这多开几个app那不是直接卡死崩溃。
一看就是低内存设备,大家伙想方设法的优化内存,比如删减不用的系统apk,以及普通的apk。然而没啥效果,最多也就节省十几M的Free RAM,根本不够用。我也去调了 heapsize 那些参数,也是没啥效果,多开几个app还是直接挂掉。
其实在谷歌的android文档里面就有对低内存设备的配置方法
网址是:https://source.android.google.cn/devices/tech/perf/low-ram
其实谷歌对低内存是有进行过优化的,从文档里面我们就可以看到谷歌做过哪些修改,以及如何配置。文档里面我觉得最可行的办法就是zram,什么是zram?
zram 交换可通过压缩内存页面并将其放入动态分配的内存交换区来增加系统中的可用内存量。这是以牺牲 CPU 时间为代价来增加少量内存。zram其实并不会真的增加内存,只是通过压缩,变相的增大内存使用空间。
最开始的dumpsys meminfo的图我们可以看到,ZRAM已经开了,但是 102,396K total swap 也就是开了100M的zram,只能压缩100M的内存,那怎么够用。
在谷歌的android文档里面,有zram的配置方法,/dev/block/zram0 none swap defaults zramsize=,swapprio= 于是我们可以修改zram的size,来看看效果如何。
ZRAM in Linux free memory
ZRAM_SIZE=100 # unit: MB , 0 = disable
在代码中搜索到以上代码,果然不出我所料,只开了100M的zram,于是我把zram开到最大,给他1000M,我这边最大只能开到1000M了。
把zram开大之后,多开几个app,不会卡死崩溃了,效果还是有的,但是开浏览器播放视频什么的,还是会卡,zram是有用,但是也只是把后台的应用压缩存储,当前台的应用占用内存过多的时候,还是顶不住啊。
总结:
zram的确可以优化内存不足的问题,但是心病还需心药医,内存不足最根本还是要从内存入手,增大内存才是治标治本之法。