monkey测试android 内存耗尽,触发kswapd0 内存

本文分析了monkey测试中出现ANR的原因,包括内存不足、kswapd0占用过高及Activity未正常回收等问题,并提出了通过调整Activity的launchMode来解决这些问题的方法。

问题:monkey测试发现多个APP报ANR,

1.内存不足:

09-27 00:44:19.061  2986  2986 I lowmemorykiller: Unable to free enough memory (pages to free=18108, pages freed=0)
09-27 00:44:19.065  2986  2986 I lowmemorykiller: Unable to free enough memory (pages to free=16470, pages freed=0)
09-27 00:44:19.068  2986  2986 I lowmemorykiller: Unable to free enough memory (pages to free=16470, pages freed=0)

2.大量时间在kswapd0

kswapd0 占用过高是因为 物理内存不足,使用swap分区与内存换页操作交换数据,导致CPU占用过高。

98% TOTAL: 15% user + 31% kernel + 50% iowait + 1% softirq

09-27 00:35:16.199  8963 10593 W Monkey  : CPU usage from 0ms to 36534ms later (2020-09-27 00:32:04.657 to 2020-09-27 00:32:41.190):
09-27 00:35:16.199  8963 10593 W Monkey  :   74% 895/kswapd0: 0% user + 74% kernel

 3.查看进线程耗费内存,直到总体累计4.2G,系统卡死

  PID USER         PR  NI VIRT  RES  SHR S[%CPU] %MEM     TIME+ THREAD
 4606 u0_a76       10 -10 4.2G 803M 4.1M R  3.2  21.3   6:36.08 xxx.xxx.xx
 4606 u0_a76       24   4 4.2G 803M 4.1M R  0.6  21.3   1:08.68 HeapTaskDaemon
 4606 u0_a76       10 -10 4.2G 804M 4.1M S  0.3  21.4   2:14.74 RenderThread
 4606 u0_a76       20   0 4.2G 803M 4.1M S  0.3  21.3   0:00.31 RxSchedulerPurg
 4606 u0_a76       20   0 4.2G 804M 4.1M S  0.0  21.4   0:00.00 pool-102-thread
 4606 u0_a76       20   0 4.2G 804M 4.1M S  0.0  21.4   0:00.00 Timer-101
 4606 u0_a76       20   0 4.2G 804M 4.1M S  0.0  21.4   0:00.00 Timer-100
 4606 u0_a76       20   0 4.2G 804M 4.1M S  0.0  21.4   0:00.00 RxCachedThreadS
 4606 u0_a76       20   0 4.2G 804M 4.1M S  0.0  21.4   0:00.00 RxCachedThreadS
 4606 u0_a76       20   0 4.2G 804M 4.1M S  0.0  21.4   0:00.00 Okio Watchdog
 4606 u0_a76       20   0 4.2G 804M 4.1M S  0.0  21.4   0:00.03 RxCachedThreadS
 4606 u0_a76       20   0 4.2G 804M 4.1M S  0.0  21.4   0:00.04 RxCachedThreadS
 4606 u0_a76       20   0 4.2G 804M 4.1M S  0.0  21.4   0:00.00 Timer-99
 4606 u0_a76       20   0 4.2G 804M 4.1M S  0.0  21.4   0:00.00 Timer-98
 4606 u0_a76       20   0 4.2G 804M 4.1M S  0.0  21.4   0:00.03 RxCachedThreadS
 4606 u0_a76       20   0 4.2G 804M 4.1M S  0.0  21.4   0:00.03 RxCachedThreadS
 4606 u0_a76       20   0 4.2G 804M 4.1M S  0.0  21.4   0:00.02 RxCachedThreadS
 4606 u0_a76       20   0 4.2G 804M 4.1M S  0.0  21.4   0:00.03 RxCachedThreadS
 4606 u0_a76       20   0 4.2G 804M 4.1M S  0.0  21.4   0:00.01 RxCachedThreadS
 4606 u0_a76       20   0 4.2G 804M 4.1M S  0.0  21.4   0:00.01 RxCachedThreadS

 

4.看一下 activity

adb shell dumpsys activity后发现

  (TaskRecord 一共有46个Activity存在,问题就是在这里,一直没回收或者复用导致)

  #0 TaskRecord{xxxxx #232 A=of.radio.hz U=0 StackId=4 sz=47} type=standard mode=fullscreen
     #46 ActivityRecord{fxxxxc u0 com.xx.xx/.yy.XxxActivity t232} type=standard mode=fullscreen
 5.再去看AndroidManifest.xml

发现是launchMode="singleTop",即:如果不是栈顶,每次都会重新创建(标准模式也是每次会重新创建)

  <activity android:name="xxx." android:launchMode="singleTop"

6.解决办法:android:launchMode="singleInstance",单例模式只保留一个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值