主要观点总结
本文主要介绍了如何检测和解决主线程等待锁的问题,包括技术基础、实现思路、具体实现和问题解决等关键点。
关键观点总结
关键观点1: 技术基础
介绍了如何通过Java线程状态检测主线程是否等待锁,以及相关技术知识点,如线程状态和Monitor的获取。
关键观点2: 实现思路
描述了基于技术基础,如何大致监控主线程锁等待的方法,包括轮询主线程状态和通过jni函数调用获取被等待的线程的id。
关键观点3: 具体实现和问题
详细阐述了实现过程中需要处理的问题,如如何调用jni函数、获取函数签名、对齐线程id等,并介绍了如何通过反射获取Thread指针。
关键观点4: 总结
总结了整个方案的实现过程,并推荐了相关的网站资源。同时提到了文章推荐阅读和其他相关内容。
文章预览
去年处理一些性能问题的时候,遇到过一些主线程等待锁的问题,如果主线程等待锁的时间太长,就会出现主线程卡顿甚至ANR。所以我们需要通过技术手段去检测可能存在的锁等待。 1 技术基础 如何检测主线程等待锁?这里涉及一些技术基础知识点: 线程状态 Java线程可以通过 getState 获取线程的状态,线程状态包括 NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITTING、TERMINATED 几个状态,其中 BLOCKED 就是等待锁的时候进入的阻塞状态。 获取线程想要竞争的Monitor 在art源码的 monitor.cc 里面通过 GetContendedMonitor 函数可以获取某个 Thread 在等待的 Monitor: 获取Monitor被持有的线程 也是在 monitor.cc 里面可以通过 GetLockOwnerThreadId 获取 monitor 被持有的线程: 2 实现思路 有了上述技术基础,我们就可以出现一个大致的主线程锁等待的监控。我们可以按一定频次轮训主
………………………………