Android性能:trace上的锁竞争monitor contention with owner at

Android性能:trace上的锁竞争monitor contention with owner at

锁竞争场景

在Android的trace中,出现monitor contention with owner at信息,表明存在线程间的锁竞争问题。

  1. ‌锁竞争

锁竞争‌:当多个线程尝试访问同一资源时,若该资源被锁保护(如synchronized方法或块),线程需等待锁释放才能继续执行。若锁长时间被占用,后续线程将进入等待状态,形成竞争。

monitor contention(竞争)‌:Java中的monitor是实现synchronized机制的核心,contention线程因竞争锁而阻塞。

  1. ‌日志信息解析‌

monitor contention with owner at:表示当前线程因竞争锁而阻塞,owner at指持有锁的线程号。

如果main thread中某个位置竞争锁,此时在trace上(main thread上面有CPU运行状态)明显会观察到这个点之后的一段,CPU状态是空白的,也就是说,主线程处于阻塞状态,没有running,而此时处于running的就是持有锁的那个线程。锁竞争导致UI事件变长,主线程卡顿(长时间未完成出帧)。

关键字段‌:

Owner线程‌:持有锁的线程ID,日志显示其执行位置(如com.example.MyClass:42)。

等待线程‌:尝试获取锁但被阻塞的线程ID。

等待时间‌:线程被阻塞的持续时长(如waited for 10ms)。

  1. ‌形成机理‌

锁持有时间过长‌:若锁持有线程执行耗时操作(如I/O、计算密集型任务),其他线程需等待,形成竞争。

锁粒度过大‌:保护范围过广(如同步整个方法),导致多个线程频繁竞争同一锁。

线程调度问题‌:CPU调度不当,持有锁线程优先级低或被频繁中断,延长锁等待时间。

资源争用‌:共享资源(如数据库连接、文件句柄)被多个线程频繁访问,形成竞争。

  1. ‌优化

减少锁持有时间‌:将同步块缩小到最小作用域,避免在同步块内执行耗时操作。

细化锁粒度‌:使用细粒度锁(如ReentrantLock)替代synchronized,减少竞争。

异步处理‌:将耗时任务异步执行,避免阻塞主线程。

线程优先级调整‌:合理设置线程优先级,避免低优先级线程长时间持有锁。

比如,monitor contention with owner at com.example.MyClass:42,表示MyClass:42处的锁被持有线程占用,其他线程需等待。需检查该行代码的执行逻辑,优化锁粒度或减少锁持有时间。

Monitor 指的是当前锁对象的池,在 Java 中,每个对象都有两个池,锁(monitor)池和等待池:

锁池(同步队列 SynchronizedQueue ):假设线程 A 已经拥有了某个对象(注意:不是类 )的锁,而其它的线程想要调用这个对象的某个 synchronized 方法(或者 synchronized 块),由于这些线程在进入对象的 synchronized 方法之前必须先获得该对象的锁的拥有权,但是该对象的锁目前正被线程 A 拥有,所以这些线程就进入了该对象的锁池中。这里用了争夺(contention)这个词,意思是这里由于在和目前对象的锁正被其他对象(Owner)所持有,所以没法得到该对象的锁的拥有权,所以进入该对象的锁池。

Owner : 指的是当前拥有这个对象的锁的对象。

at 后面跟的是拥有这个对象的锁的对象正在做什么。

相关:

https://blog.csdn.net/zhangphil/article/details/149907463

https://zhangphil.blog.csdn.net/article/details/155359614

https://blog.csdn.net/zhangphil/article/details/131249820

相关推荐
pengyu5 小时前
【Kotlin 协程修仙录 · 炼虚境 · 初阶】 | 虚空造物:Channel 基础与协程间通信的管道艺术
android·前端·kotlin
小强闯江湖5 小时前
ViewCompose:让原生 Android View 进入声明式时代
android·开源·kotlin
摇滚侠7 小时前
《SpringBoot 3:入门与应用实战》第 6 章 Spring Boot 最佳实践 阅读笔记 12
android·spring boot·笔记
mmsx7 小时前
Android 宠物健康服务平台实战:从架构设计到主题换肤完整解析(源码和文档)
android·架构·sqlite·app·源码·宠物
、如果7 小时前
ima Skills 自进化实战:三层结构、反馈与版本验证
android·人工智能·ai编程
hunterandroid8 小时前
自定义 View 绘制与触摸冲突:从滑动卡顿到事件分发闭环
android·前端
weixin_403810138 小时前
安卓自动化脚本 HID 硬件选购指南:蓝牙HID与OTG HID区别、成本与搭建教程
android·运维·自动化·hid·安卓自动化脚本·安卓中控
qq_316837758 小时前
uniapp 安卓/H5 使用 contentEditable 属性 富文本编辑器
android·javascript·uni-app
二流小码农9 小时前
鸿蒙开发:了解Context
android·ios·harmonyos
404_coder9 小时前
源码视角下的 Android 开机流程(三):从 Launcher Task 到 WindowState 挂载
android