美文网首页
linklist超大导致的ANR

linklist超大导致的ANR

作者: 风之枫 | 来源:发表于2018-12-29 13:06 被阅读0次

    通过ANR的堆栈分析,ANR的堆栈都是停在了linklist的contains()函数。通过源码分析,系统提供的linklist类是通过链表的方式实现的。按说应该不会有性能问题,即使一个初级程序员来实现,查询几万条记录的耗时最多也就是几十毫秒。作为Android平台的工具类,性能应该更是顶呱呱。同事通过log日志发现,系统的linklist在1000条记录情况下查询耗时在10毫秒内。自己的手机也没能复现ANR问题。

    下面进入分析阶段:

    由于bugly的日志上报了App所有多线程堆栈情况(这点很赞),通过堆栈分析,出问题时候,主线程和子线程都在操作linklist,并且为了线程安全,业务对所有linklist操作都增加了synchronized锁。通过多个bugly上报的规律来看,子线程和主线程也都卡在了linklist的操作上。

    梳理已知信息:

    1、子线程和主线程都卡在了linklist上。

    2、子线程和主线程同时进入了不同方法的synchronized内。

    分析:

    由第一条现象可以尝试的方向是linklist是否存储的内容特别多,由于内容超多导致linklist操作耗时超长。(通过代码分析,linklist内容会定期写文件且对内容不排重,很有可能造成这种情况)

    由第二条现象可以尝试的方向是单例里持有的linklist的多个同步方法(synchronized),被子线程和主线程同时执行,是否和单例创建的安全性有关。(即创建了两个单例)

    追问:

    为什么主线程和子线程都卡在了linklist操作上,这么巧?

    原因是linklist耗时超长,所以主线程和子线程同时卡在linklist操作的概率就特别大。

    相关文章

      网友评论

          本文标题:linklist超大导致的ANR

          本文链接:https://www.haomeiwen.com/subject/lgvulqtx.html