dvm_lock_sample:当某个线程等待lock的时间blocked超过阈值(比如:500ms),则输出当前的持锁状态.
dvm_lock_sample: [system_server,1,Binder_9,1500,ActivityManagerService.java,6403,-,1448,0]
说明:system_server: Binder_9,执行到ActivityManagerService.java的6403行代码,一直在等待AMS锁, "-"代表持锁的是同一个文件,
即该锁被同一文件的1448行代码所持有, 从而导致Binder_9线程被阻塞1500ms.
------------------------------------------------------------------
dvm_lock_sample 会打印出系统主线程的一些主要方法耗费了多少时间
dvm_lock_sample:[system_server,1,Binder:1614_A,22,AlarmManagerService.java,1072,-,2496,4]
(进程名,是否主线程1是0否,线程号,花费时间,文件名,申请锁行数,持锁文件名,持锁行数,采样频率)
-----------------------------------------------------------------
03-06 13:56:00.928 1160 1740 I dvm_lock_sample: [system_server,1,Binder:1160_6,22574,ActivityTaskManagerService.java,1850,void com.android.server.wm.ActivityTaskManagerService.activityTopResumedStateLost(android.os.IBinder),
TaskChangeNotificationController.java,351,void com.android.server.wm.TaskChangeNotificationController.forAllLocalListeners(com.android.server.wm.TaskChangeNotificationController$TaskStackConsumer, android.os.Message),100]
通过分析log,在13:56:00.927节点的时候,TaskChangeNotificationController.forAllLocalListeners()方法持有了WindowManagerGlobalLock锁导致ActivityTaskManagerService.activityTopResumedStateLost()方法一直在等待WindowManagerGlobalLock锁释放,等待时长为22.574 s
TaskChangeNotificationController.forAllLocalListeners
private void forAllLocalListeners(TaskStackConsumer callback, Message message) {
synchronized (mServiceLock) {
for (int i = mLocalTaskStackListeners.size() - 1; i >= 0; i--) {
try {
callback.accept(mLocalTaskStackListeners.get(i), message);
} catch (RemoteException e) {
// Never thrown since this is called locally.
}
}
}
}
该方法中持有了WindowManagerGlobalLock锁,然后执行了for循环,执行callback回调