1.问题现象 背景:车机在跑monkey一晚上,早上使用车机用着用着就重启了。
2.问题定位 查看dropbox日志,发现有system_server_watchdog@11839.txt
和system_server_lowmem@322442.txt
这两个文件。初步判断是watchdog将systemserver杀死了,SystemServer重启导致系统Android系统重启。
3.分析日志 其实正常看watchdog日志杀进程一般从main开始看,但是这里报了system_server_lowmem@322442.txt
这个文件,可以直接从内存方面开始看。以往经验,watchdog杀进程有很大可能是死锁导致的,为了确认一遍是不是systemserver死锁了,还是从main开始看吧。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 "main" prio=5 tid=1 Native | group="main" sCount=1 dsCount=0 flags=1 obj=0x74809b28 self=0x7bbd014c00 | sysTid=10854 nice=-2 cgrp=default sched=0 /0 handle=0x7c42acb548 | state=S schedstat=( 856567511 259290113 1965 ) utm=62 stm=22 core=2 HZ=100 | stack=0x7ff7a16000 -0x7ff7a18000 stackSize=8MB | held mutexes= kernel: (couldn't read /proc/self/task/10854/stack) native: #00 pc 000000000006e118 /system/lib64/libc.so (__epoll_pwait+8) native: #01 pc 0000000000013f38 /system/lib64/libutils.so (android::Looper::pollInner(int)+144) native: #02 pc 0000000000013e0c /system/lib64/libutils.so (android::Looper::pollOnce(int, int*, int*, void**)+60) native: #03 pc 000000000011f8e4 /system/lib64/libandroid_runtime.so (android::android_os_MessageQueue_nativePollOnce(_JNIEnv*, _jobject*, long, int)+44) at android.os.MessageQueue.nativePollOnce(Native method) at android.os.MessageQueue.next(MessageQueue.java:326) at android.os.Looper.loop(Looper.java:160) at com.android.server.SystemServer.run(SystemServer.java:460) at com.android.server.SystemServer.main(SystemServer.java:296) at java.lang.reflect.Method.invoke(Native method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:838)
从这里可以看到main主线程阻塞在nativePollOnce中,这个是正常的。因此初步断定和死锁关系不大。
那开始分析一下内存OOM的情况吧。
1 2 3 4 5 6 7 8 9 10 11 12 # 日志数据 ...... Total number of allocations 5178758 Total bytes allocated 275MB Total bytes freed 262MB Free memory 677KB Free memory until GC 677KB Free memory until OOME 371MB Total memory 13MB Max memory 384MB Zygote space size 1344KB ......
1 2 3 4 5 6 7 8 9 # 字段说明 Total number of allocations 476778 进程创建到现在一共创建了多少对象 Total bytes allocated 52MB 进程创建到现在一共申请了多少内存 Total bytes freed 52MB 进程创建到现在一共释放了多少内存 Free memory 777KB 不扩展堆的情况下可用的内存 Free memory until GC 777KB GC前的可用内存 Free memory until OOME 383MB OOM之前的可用内存 Total memory 当前总内存(已用+可用) Max memory 384MB 进程最多能申请的内存
如果当发现Free memory until OOME很小的时候,代表可用内存快慢了,一般情况下,这个应用都有内存泄露。
上日志数据中可以看到OOME已经到371MB了,只剩13M可以用了。其实可以断定是SystemServer内存泄露导致被杀了。
接下来可以用性能监控工具确认一下system_server泄露点,然后分析定制的SystemServcer中是否有资源没释放,单例持有对象,让对象无法被销毁。
版权声明: 此文章版权归Jack Ou所有,如有转载,请註明来自原作者