MonkeyTest中一个OOM引起SWT问题的分析

拿到问题log以后,首先搜索error信息,关键字一般是SWT、Watchdog、Exception等等,也可以用工具直接(如QAAT等),我们得到如下的错误信息:

01-02 07:36:27.424 1003 1086 E WindowManager: java.lang.OutOfMemoryError: Failed to allocate a 3686412 byte allocation with 565640 free bytes and 552KB until OOM
01-02 07:36:27.424 1003 1086 E WindowManager:     at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
01-02 07:36:27.424 1003 1086 E WindowManager:     at android.graphics.Bitmap.nativeCopy(Native Method)
01-02 07:36:27.424 1003 1086 E WindowManager:     at android.graphics.Bitmap.copy(Bitmap.java:608)
01-02 07:36:27.424 1003 1086 E WindowManager:     at com.android.server.wm.WindowStateAnimator.doCacheBitmap(WindowStateAnimator.java:2320)
01-02 07:36:27.424 1003 1086 E WindowManager:     at com.android.server.wm.WindowManagerService$H.handleMessage(WindowManagerService.java:9102)
01-02 07:36:27.424 1003 1086 E WindowManager:     at android.os.Handler.dispatchMessage(Handler.java:110)
01-02 07:36:27.424 1003 1086 E WindowManager:     at android.os.Looper.loop(Looper.java:208)
01-02 07:36:27.424 1003 1086 E WindowManager:     at android.os.HandlerThread.run(HandlerThread.java:61)
01-02 07:36:27.424 1003 1086 E WindowManager:     at com.android.server.ServiceThread.run(ServiceThread.java:46)
01-02 07:38:04.345 1003 1615 E Watchdog: **SWT happen **Blocked in monitor com.android.server.am.ActivityManagerService on foreground thread (android.fg), Blocked in handler on main thread (main), Blocked in handler on display thread (android.display), Blocked in handler on ActivityManager (ActivityManager)

从log上看,是发生了SWT,原因初步判断是 java.lang.OutOfMemoryError。同时我们还在其他时间点也发现了类似错误的log:

01-02 05:46:33.461178 897 946 E AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: android.bg
01-02 05:46:33.461178 897 946 E AndroidRuntime: java.lang.OutOfMemoryError: Failed to allocate a 356640 byte allocation with 314312 free bytes and 306KB until OOM
01-02 05:46:33.461178 897 946 E AndroidRuntime:     at android.os.Parcel.nativeMarshall(Native Method)
01-02 05:46:33.461178 897 946 E AndroidRuntime:     at android.os.Parcel.marshall(Parcel.java:451)
01-02 05:46:33.461178 897 946 E AndroidRuntime:     at com.android.internal.os.BatteryStatsImpl.commitPendingDataToDisk(BatteryStatsImpl.java:9979)
01-02 05:46:33.461178 897 946 E AndroidRuntime:     at com.android.internal.os.BatteryStatsImpl$5.run(BatteryStatsImpl.java:9959)
01-02 05:46:33.461178 897 946 E AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:836)
01-02 05:46:33.461178 897 946 E AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:103)
01-02 05:46:33.461178 897 946 E AndroidRuntime:     at android.os.Looper.loop(Looper.java:208)
01-02 05:46:33.461178 897 946 E AndroidRuntime:     at android.os.HandlerThread.run(HandlerThread.java:61)
01-02 05:46:40.676155 3521 3521 E AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: main

<7>[111646.751373] -(7)[3521:commands.monkey][name:mtprof&][signal][3521:commands.monkey] send death sig 9 to [3521:commands.monkey:R]

既然有出现多次OOM的问题,首先肯定先要设法解决,分析内存问题,可以用到MAT工具。具体使用方法参考如下地址:内存分析工具MAT的使用
连接MAT工具复现问题抓取dump信息,发现复现了3次,三个文件里面,每个文件里面的WindowManagerService有6个Bitmap(每个Bitmap约3.5M),

system_server17_conv.hprof与system_server15_conv.hprof比较,多了1个Bitmap(约1.1MB),
system_server15_conv.hprof与system_server12_conv.hprof比较,多了1个Bitmap(约1.1MB),

Bitmap的引用关系如下,是com.android.server.telecom.Log里面Bitmap在不断的增加。

com.android.server.telecom.Log
mCallEventRecordMap java.util.HashMap @ 0x132ddb00
table java.util.HashMap$HashMapEntry[8] @ 0x13857a60
key com.android.server.telecom.Call @ 0x14c07ca0
mCallerInfo com.android.internal.telephony.CallerInfo @ 0x141c7090
cachedPhoto android.graphics.drawable.BitmapDrawable @ 0x14397e08
mBitmapState android.graphics.drawable.BitmapDrawable$BitmapState @ 0x149a3890
mBitmap android.graphics.Bitmap @ 0x13ec45b0

在这里需要check下是否telecom相关模块是否有泄漏还是要显示多张Bitmap,我们这里因为被客户客制化的代码引起,交由客户修改。
另外在monkey test中常常由于发生ANR,WMS一直去dumpLocked,导致卡死发生SWT。一般我们可以在WindowManagerService.saveANRStateLocked()方法中屏蔽了dumpDisplayContentsLocked。
即发生ANR时不去dump内容即可。这样就没有IO操作,从根本上杜绝了此类SWT发生。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值