安卓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相关推荐

  1. 【Android】Long monitor contention with owner ...

    这是一个警告信息,它的完整格式如下 Long monitor contention with owner thread-xxx at method-xxx1 in method-xxx2 for 30 ...

  2. Android Systrace 基础知识(10) - Binder 和锁竞争解读

    本文是 Systrace 系列文章的第十篇,主要是对 Systrace 中的 Binder 和锁信息进行简单介绍,简单介绍了 Binder 的情况,介绍了 Systrace 中 Binder 通信的表 ...

  3. Systrace 基础知识 - 锁竞争解读

    参考连接:https://www.androidperformance.com/2019/12/06/Android-Systrace-Binder/ 1.Systrace 显示的锁的信息 monit ...

  4. android 如何分析卡顿问题

    根据App包名 & uid 通过时间点附近的上下文找到App的pid 下面仅举例(其他方式获取也可以) Package [com.miui.weather2] (5c2d4cd): userI ...

  5. 启动优化·基础论·浅析 Android 启动优化

    " [小木箱成长营]启动优化系列文章(排期中): 启动优化 · 工具论 · 启动优化常见的六种工具 启动优化 · 方法论 · 这样做启动优化时长降低 70% 启动优化 · 实战论 · 手把手 ...

  6. openfire html5,XMPP,Smack,Openfire 异常、问题总结

    1.Smack 4.2.3,入群时老是报无响应,还未找到缘由(源码问题),已找到缘由,openfire4.2.0+版本自身bug,不支持用户110状态html Exception=org.jiveso ...

  7. 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提供的 ...

  8. Android10 开机向导流程

    最近在弄开机向导,网上查了查,基本都是参照系统的​​​​​​Provision应用来做的,而且还要将apk打包到系统目录下的pri-app目录下,打包到其他目录下不行,参照着做是没问题,但是好奇为什么 ...

  9. java什么是monitor和Monitor监视器锁、对象布局

    文章目录 Monitor监视器锁 什么是moniter 对象布局 Monitor监视器锁 每个同步对象都有一个自己的Monitor(监视器锁),加锁过程如下图所示: 任何一个对象都有一个Monitor ...

最新文章

  1. 【Redis系列】深入浅出Redis主从复制之哨兵模式【实践】
  2. Linux 卷管理详解[ pv vg lv] —— 之三
  3. l洛谷P4779 【模板】单源最短路径(标准版)(dijkstra)
  4. 什么是压缩感知?[简单概括]
  5. java怎么输出点,Java实现控制台输出两点间距离
  6. Java多线程--对象的可见性
  7. SuperMap.IS.AjaxScript之常用功能实现研究及使用
  8. winform的ftp方式上传
  9. hdfs中与file数组类似的数组_Java中的数组
  10. 对话机器人技术简介:问答系统、对话系统与聊天机器人
  11. 医药、药品、医疗器械类网站备案需要什么材料?
  12. [Linux Audio Driver] 移植外部CODEC常见编译报错解决(持续更新)
  13. 安卓上哔哩哔哩视频的导出
  14. 同款蓝牙耳机为什么会串联_大牌奢侈品同款TWS新蓝牙耳机体验
  15. j2ee期末考试总结
  16. Redis集群搭建失败 connected_slaves:0
  17. 独立同分布(Independently and Identically Distributed, iid)
  18. 银行春招:六大行薪资待遇知多少?(下)
  19. 一次小米手环BLE通信协议的逆向之旅
  20. python 基于搜索引擎实现文章查重

热门文章

  1. matlab在概率统计中的应用
  2. 中国程序员最容易读错的70个英文单词,非常值得一看!
  3. lenovo电脑的麦克风没有声音?声音小?甚至有杂音,无法聊天?
  4. 踩坑:云服务器Nginx部署前端遇到http与https问题
  5. win7设置电脑锁屏时间
  6. 推荐三个开发C程序的工具(适用各种场合)
  7. Qt for IOS 制作APP启动页面
  8. 计算机专业方面期刊介绍--
  9. 解决OpenCV读取图片慢的方案
  10. 冒泡排序法定向冒泡排序法的Python实现