概述
本次分析 ANR 的问题原因是由于应用内存过低,主线程等待 GC 线程完成而导致的 ANR。
分析
从 /data/anr/ 目录下面拉取到 trace 文件,首先看看 main 线程的情况:
1 | "main" prio=5 tid=1 WaitingForGcToComplete |
主线程正在 WaitingForGcToComplete,等待 GC 结束。
看一下内存使用情况:
1 | Heap: 0% free, 255MB/256MB; 8277953 objects |
目前内存只有 488K 的剩余,已经接近 256M 的内存限制,内存对象有5千多万,也就是说GC过程需要扫描这些对象的巨大部分,导致耗时很久,另外内存距离OOM只有 488K ,说明有内存泄漏,或内存使用不合理。
另外查看线程信息时发现,此时有大量的线程在运行,仅其中一种类型的线程 [io]-XX竟然有100多个:
1 | "[io]-1564" prio=5 tid=79 Blocked |
[io]-1582 也是在等待 GC 完成状态,由于该方法正在执行一个 synchronized 方法,竟然导致有 100 多个线程在等待锁的释放。
根据这个线索,发现执行这些线程是因为前端页面正在创建一个800多个item的列表,复现这个步骤时虽然不会每次都发生 anr,但是界面有明显的卡顿现象。采用分页加载后解决了这个问题。
完成的 trace 日志见注释内容: