Long monitor contention with owner
安卓Activity在finish后出现黑屏, 大概率是因为主线程卡死。 抓trace和logcat。
04-16 16:18:17.359 W/m.lianjia.beik(30714): Long monitor contention with owner Binder:30714_6 (32307) at void java.lang.Object.wait(long, int)(Object.java:-2) waiters=0 in android.content.ComponentName com.ke.ljplugin.component.service.server.PluginServiceServer$Stub.startService(android.content.Intent, android.os.Messenger) for 5.996s
04-16 16:18:17.360 W/m.lianjia.beik(30714): Current owner stack:
04-16 16:18:17.360 W/m.lianjia.beik(30714): (no managed stack frames)
04-16 16:18:17.360 W/m.lianjia.beik(30714): Contender stack:
04-16 16:18:17.360 W/m.lianjia.beik(30714): at com.ke.ljplugin.component.service.server.PluginServiceServer$Stub.startService(PluginServiceServer.java:554)
04-16 16:18:17.360 W/m.lianjia.beik(30714): at com.ke.ljplugin.component.service.PluginServiceClient.startService(PluginServiceClient.java:106)
04-16 16:18:17.360 W/m.lianjia.beik(30714): at com.ke.loader2.PluginContext.startService(PluginContext.java:516)
04-16 16:18:17.360 W/m.lianjia.beik(30714): at com.lianjia.sdk.im.service.IMService.startIMService(link:100)
04-16 16:18:17.360 W/m.lianjia.beik(30714): at com.lianjia.sdk.im.IMManager.initIMService(link:316)
04-16 16:18:17.360 W/m.lianjia.beik(30714): at com.lianjia.sdk.im.IMManager.syncData(link:263)
04-16 16:18:17.360 W/m.lianjia.beik(30714): at com.lianjia.sdk.im.IMManager.access$200(link:51)
04-16 16:18:17.360 W/m.lianjia.beik(30714): at com.lianjia.sdk.im.IMManager$2.call(link:250)
04-16 16:18:17.360 W/m.lianjia.beik(30714): at com.lianjia.sdk.im.IMManager$2.call(link:240)
04-16 16:18:17.360 W/m.lianjia.beik(30714): at rx.internal.util.ActionSubscriber.onNext(ActionSubscriber.java:39)
04-16 16:18:17.360 W/m.lianjia.beik(30714): at rx.observers.SafeSubscriber.onNext(SafeSubscriber.java:134)
04-16 16:18:17.360 W/m.lianjia.beik(30714): at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.call(OperatorObserveOn.java:224)
04-16 16:18:17.360 W/m.lianjia.beik(30714): at rx.android.schedulers.LooperScheduler$ScheduledAction.run(LooperScheduler.java:107)
04-16 16:18:17.360 W/m.lianjia.beik(30714): at android.os.Handler.handleCallback(Handler.java:873)
04-16 16:18:17.360 W/m.lianjia.beik(30714): at android.os.Handler.dispatchMessage(Handler.java:99)
04-16 16:18:17.360 W/m.lianjia.beik(30714): at android.os.Looper.loop(Looper.java:201)
04-16 16:18:17.360 W/m.lianjia.beik(30714): at android.app.ActivityThread.main(ActivityThread.java:6806)
04-16 16:18:17.360 W/m.lianjia.beik(30714): at java.lang.reflect.Method.invoke(Native method)
04-16 16:18:17.360 W/m.lianjia.beik(30714): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
04-16 16:18:17.360 W/m.lianjia.beik(30714): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)
04-16 16:18:17.360 W/m.lianjia.beik(30714):
04-16 16:18:17.388 I/Choreographer(30714): Skipped 361 frames! The application may be doing too much work on its main thread.
日志示例:“
04-15 14:11:33.634 I/Choreographer(23776): Skipped 365 frames! The application may be doing too much work on its main thread.
”
触发条件: SKIPPED_FRAME_WARNING_LIMIT值为30, 即丢了30帧时打印这行日志, 对应0.5秒。
void doFrame(long frameTimeNanos, int frame) {。。。if (skippedFrames >= SKIPPED_FRAME_WARNING_LIMIT) {Log.i(TAG, "Skipped " + skippedFrames + " frames! "+ "The application may be doing too much work on its main thread.");}
滑动滚轮在main里找宽度大的条目(每种颜色代码一个函数), 宽度越大说明占用CPU越长。 点击图像里的条目可以索引到下面的函数。
PS:滑动鼠标中间的滚轮可以放大或缩小柱状图。
关注核心指标:
Cpu Time/Call, 函数执行时长
Real Time/Call, 占用CPU时间,包括切换、阻塞时间。 Calls+Recur/Call, 调用次数(含递归)总次数
例如图片里startService的Cpu Time等于12.964ms, 但Real Time等于6013.609ms, 差距非常大。 原因在于startService使用了同步机制,即阻塞等待。 Logcat的第一句java.lang.Object.wait…, 当主线程卡死但没到ANR程度时, logcat里提示丢帧“too much work on its main thread"。
打印日志后可以搜索“too much”关键字。
Long monitor contention with owner相关推荐
- 【Android】Long monitor contention with owner ...
这是一个警告信息,它的完整格式如下 Long monitor contention with owner thread-xxx at method-xxx1 in method-xxx2 for 30 ...
- Android Systrace 基础知识(10) - Binder 和锁竞争解读
本文是 Systrace 系列文章的第十篇,主要是对 Systrace 中的 Binder 和锁信息进行简单介绍,简单介绍了 Binder 的情况,介绍了 Systrace 中 Binder 通信的表 ...
- Systrace 基础知识 - 锁竞争解读
参考连接:https://www.androidperformance.com/2019/12/06/Android-Systrace-Binder/ 1.Systrace 显示的锁的信息 monit ...
- android 如何分析卡顿问题
根据App包名 & uid 通过时间点附近的上下文找到App的pid 下面仅举例(其他方式获取也可以) Package [com.miui.weather2] (5c2d4cd): userI ...
- 启动优化·基础论·浅析 Android 启动优化
" [小木箱成长营]启动优化系列文章(排期中): 启动优化 · 工具论 · 启动优化常见的六种工具 启动优化 · 方法论 · 这样做启动优化时长降低 70% 启动优化 · 实战论 · 手把手 ...
- openfire html5,XMPP,Smack,Openfire 异常、问题总结
1.Smack 4.2.3,入群时老是报无响应,还未找到缘由(源码问题),已找到缘由,openfire4.2.0+版本自身bug,不支持用户110状态html Exception=org.jiveso ...
- Fatal signal 11 (SIGSEGV), code 1, fault addr 0x10457e30d996b in tid 5676 (ndroid.settings)
FROM:http://blogold.chinaunix.net/u3/104564/showart_2091186.html 一.安装交叉编译器 1)交叉编译器使用CodeSourcery提供的 ...
- Android10 开机向导流程
最近在弄开机向导,网上查了查,基本都是参照系统的Provision应用来做的,而且还要将apk打包到系统目录下的pri-app目录下,打包到其他目录下不行,参照着做是没问题,但是好奇为什么 ...
- java什么是monitor和Monitor监视器锁、对象布局
文章目录 Monitor监视器锁 什么是moniter 对象布局 Monitor监视器锁 每个同步对象都有一个自己的Monitor(监视器锁),加锁过程如下图所示: 任何一个对象都有一个Monitor ...
最新文章
- 【Redis系列】深入浅出Redis主从复制之哨兵模式【实践】
- Linux 卷管理详解[ pv vg lv] —— 之三
- l洛谷P4779 【模板】单源最短路径(标准版)(dijkstra)
- 什么是压缩感知?[简单概括]
- java怎么输出点,Java实现控制台输出两点间距离
- Java多线程--对象的可见性
- SuperMap.IS.AjaxScript之常用功能实现研究及使用
- winform的ftp方式上传
- hdfs中与file数组类似的数组_Java中的数组
- 对话机器人技术简介:问答系统、对话系统与聊天机器人
- 医药、药品、医疗器械类网站备案需要什么材料?
- [Linux Audio Driver] 移植外部CODEC常见编译报错解决(持续更新)
- 安卓上哔哩哔哩视频的导出
- 同款蓝牙耳机为什么会串联_大牌奢侈品同款TWS新蓝牙耳机体验
- j2ee期末考试总结
- Redis集群搭建失败 connected_slaves:0
- 独立同分布(Independently and Identically Distributed, iid)
- 银行春招:六大行薪资待遇知多少?(下)
- 一次小米手环BLE通信协议的逆向之旅
- python 基于搜索引擎实现文章查重