java.util.concurrent.TimeoutException问题分析

  • 异常分析
  • 解决方案
  • 问题延展

异常分析

在开发过程中出现这样的异常:

E AndroidRuntime: FATAL EXCEPTION: FinalizerWatchdogDaemon
E AndroidRuntime: Process: com.test.myapp, PID: 1156
E AndroidRuntime: java.util.concurrent.TimeoutException: android.graphics.Path.finalize() timed out after 10 seconds
E AndroidRuntime: at android.graphics.Path.finalizer(Native Method)
E AndroidRuntime: at android.graphics.Path.finalize(Path.java:748)
E AndroidRuntime: at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:229)
E AndroidRuntime: at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:207)
E AndroidRuntime: at java.lang.Thread.run(Thread.java:818)

当垃圾收集器确定不再有对该对象的引用时,垃圾收集器会在对象上调用受保护的方法 finalize。子类覆盖finalize方法以释放系统资源或执行其他清理。Android系统的看门狗watchdog机制检测finalizer在超时时间(10秒)内有没有成功回收对象。未能回收对象导致的方面有多个:FinalizerDaemon线程回收的对象太多、系统资源占用高、CPU负载过高或者内存过低等等。
在应用中,通过Profiler监测,应用进程在一秒钟内绘制了数百条路径Path,追查代码到一个自定义的轨迹View中:

    private class AnimatorUpdateListener implements ValueAnimator.AnimatorUpdateListener {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {setDynamicTrackPath();invalidate();}}private void setDynamicTrackPath(){Path upperEdgeTrackPath = new Path();Path middleEdgeTrackPath = new Path();Path bottomEdgeTrackPath = new Path();...代码省略}@Overrideprotected void onDraw(Canvas canvas) {//绘制轨迹Path...代码省略}

在自定义View代码中,通过ValueAnimator来实现动画的连续绘制。由于通讯设备会频繁回调数据,ValueAnimator动画也会一值实行,频率高达100ms一次,ValueAnimator动画也会在100ms内进行多次值回调,从而导致setDynamicTrackPath方法中频繁创建了很多Path对象,这就是问题所在。

解决方案

避免频繁重复创建对象,将要绘制的轨迹Path定义为全局变量,在需要初始化轨迹时,调用Path.reset()进行重置,重置后可以正常初始轨迹而不用新建Path对象。

private Path mUpperEdgeTrackPath = new Path();private Path mMiddleEdgeTrackPath = new Path();private Path mBottomEdgeTrackPath = new Path();private void setDynamicTrackPath(){mUpperEdgeTrackPath.reset();mMiddleEdgeTrackPath.reset();mBottomEdgeTrackPath.reset();}

问题延展

出现此异常请检查代码是否频繁创建对象,大概有以下三种情况:

  1. 在循环中频繁创建对象。
  2. onDraw中创建对象,View.onDraw会被频繁的调用。
  3. 数据频繁更新,导致方法回调时频繁创建对象。

在上述问题中,频繁创建对象不知导致应用奔溃,时间久了会导致OOM,从而引发ANR问题。应避免频繁创建对象,尽量进行对象复用,也可采用对象池等等方案来复用对象。

java.util.concurrent.TimeoutException: android.graphics.Path.finalize() timed out问题分析相关推荐

  1. Flink 异步IO时 java.util.concurrent.TimeoutException: Async function call has timed out.

    Flink 异步IO时 timeout报错 java.lang.Exception: An async function call terminated with an exception. Fail ...

  2. oppo手机java.util.concurrent.TimeoutException异常处理

    今天收到了用户反馈app发帖会闪退,了解用户的手机是oppo和app版本后,就去听云bug列表查看.定位到听云bug如下: java.util.concurrent.TimeoutException: ...

  3. 异常-java.util.concurrent.TimeoutException: Futures timed out after [100000 milliseconds]

    异常-java.util.concurrent.TimeoutException: Futures timed out after [100000 milliseconds] 参考文章: (1)异常- ...

  4. Rabbitmq java.util.concurrent.TimeoutException小问题解决

    最近在研究rabbitmq的各个工作模式时. 出现了一个rabbitmq java.util.concurrent.TimeoutException异常 java.util.concurrent.Ti ...

  5. java.util.concurrent.TimeoutException: Waited 3000 milliseconds (plus 2 milliseconds, 351400 nanosec

    使用若依的微服务项目时,在本地启动项目时报错如下: java.util.concurrent.TimeoutException: Waited 3000 milliseconds (plus 2 mi ...

  6. SpringbootAdmin java.util.concurrent.TimeoutException 离线解决办法

    简述 系统架构是微服务架构,主要Springboot+Nacos,服务比较多想通过SpringbootAdmin对服务进行监控.测试环境一切正常. 问题描述 在测试环境SpringbootAdmin部 ...

  7. Caused by: java.util.concurrent.TimeoutException: Heartbeat of TaskManager with id timed out.

    报错信息如下: 解决办法: 将flink-conf.yaml配置文件里,将如下参数调整: heartbeat.timeout: 180000 调整后,可在管理界面上查看:

  8. java.util.concurrent 包下面的所有类

    java.util.concurrent 包下面的所有类 原子操作数类: java.util.concurrent.atomic.AtomicBoolean.class java.util.concu ...

  9. java.util.concurrent.TimeoutExceptiofor com.alibaba.nacos.shaded.io.grpc.stub.ClientCalls$GrpcFuture

    记录一次docker 安装nacos SpringBoot无法连接 错误信息 22:22:44.234 [main] ERROR c.a.n.c.r.c.g.GrpcClient - [printIf ...

最新文章

  1. DB-MySQL:MySQL 事务
  2. Linxu用户登录监测
  3. ubuntu 中vi的使用方法
  4. Java基础之GC回收
  5. 计划任务文件 linux,Linux之任务计划
  6. WEB接口测试之Jmeter接口测试自动化 (三)(数据驱动测试) 接口测试与数据驱动...
  7. 魔域java_java序列化
  8. 东山里的传说——《荒原的呼唤》选载之四
  9. 基于VGG16主干模型的segnet语义分割详解及实例
  10. Java 标识符的命名规则与规范
  11. 原生安卓X86 TV安装配置
  12. [转]一些漢字、字體/字型、内碼、輸入法資料的整理
  13. 有关期货公司出入金问题(期货的出入金)
  14. android高仿美团筛选控件,Android高仿美团首页分类按钮
  15. 秋招手撕代码:4bit转换为1bit,且是慢时钟域到快时钟域
  16. python模块(modules)
  17. 人工智能一些基础知识
  18. 用Python实现自动化测试
  19. 教资计算机报高中害死初中,教师资格证报名入口必须电脑登录吗_中小学教师资格考试网...
  20. Stanford Named Entity Recognizer (NER) 斯坦福命名实体识别(NER)

热门文章

  1. 管理经济学【三】之 消费者效用分析
  2. 面试部分梳理 - 操作系统
  3. Node——Nunjucks模板入门
  4. 安全测试演练环境搭建
  5. 好程序员Java教程之如何用Jsoup实现爬虫技术
  6. Mysql学习大全(涵盖所有需要用到的mysql知识,附有图文)
  7. JS获取中文拼音首字母,并通过拼音首字母快速查找页面内的中文内容
  8. 吉利车用鸿蒙系统,华为进军汽车产业了?吉利汽车搭载鸿蒙系统!
  9. 网传字节实习生删库,有员工回应昨晚处理事故到三点;快手宣布7月将取消大小周;中科院发布国产开源RISC-V处理器“香山”...
  10. 快讯 | 嘉益仕(Litins)应邀出席2018世界智能制造大会·江宁智能产业地标论坛