TimeoutException导致手机重启案例分析

TimeoutException导致手机重启案例分析_第1张图片

和你一起终身学习,这里是程序员Android

经典好文推荐,通过阅读本文,您将收获以导致下知识点:

一、TimeoutException 导致系统重启Log
二、TimeoutException 重启 trace 分析
三、TimeoutException 导致的重启解决方案

一、TimeoutException 导致系统重启Log

1.TimeoutException log如下:

TimeoutException导致手机重启案例分析_第2张图片

TimeoutException 导致系统重启

TimeoutException导致手机重启案例分析_第3张图片

Systemserver TimeoutException

二、TimeoutException 重启 trace 分析

1.TimeoutException Trace 如下:

TimeoutException导致手机重启案例分析_第4张图片

1090 线程 被线程134 held

TimeoutException导致手机重启案例分析_第5张图片

线程134 被线程 92 held

TimeoutException导致手机重启案例分析_第6张图片

线程 92 是卡住的主要原因 在

从重启的Jave Exception trace看由于在ART GC时,如果检查到某个对象其所属的类型overridefinalize函数,会把这个对象添加到referenceQueue中。

referenceQueueFinalizerDaemon线程监控,如果里面有内容,就会逐个取出并调用其finalize函数。

这样在下一次GC的时候才真正的把这个对象占用的memory给回收掉。

Java进程会默认等待10s,如果10s还没有执行完,进程会强制抛出TimeoutException

一般是由于当时系统IO忙或者memory比较紧张,导致不能及时唤醒这个线程及时往下执行。

三、TimeoutException 导致的重启解决方案

TimeoutException超时导致的系统重启,一般是由于当时系统IO忙或者memory比较紧张,没有太好的修改方案,只能增长超时时间,或者更换好一点的Memory

增长时间的修改方案如下

1. 修改 Daemons类

主要修改 Daemons.java中的MAX_FINALIZE_NANOS 时间。
Daemons类 路径如下:
/libcore/libart/src/main/java/java/lang/Daemons.java

private static final long MAX_FINALIZE_NANOS = 10L * NANOS_PER_SECOND;
修改为:
private static final long MAX_FINALIZE_NANOS = 15L * NANOS_PER_SECOND;
2.修改 ActivityMangerService

增长ActivityMangerService.javaCONTENT_PROVIDER_PUBLISH_TIMEOUT的时间。

ActivityMangerService类路径如下:
frameworks\base\services\core\java\com\android\server\am\ActivityMangerService.java

static final int CONTENT_PROVIDER_PUBLISH_TIMEOUT = 10*1000;
 修改为
 static final int CONTENT_PROVIDER_PUBLISH_TIMEOUT = 15*1000;

参考文献:

【腾讯文档】Android Framework 知识库
https://docs.qq.com/doc/DSXBmSG9VbEROUXF5

友情推荐:

Android 开发干货集锦

至此,本篇已结束。转载网络的文章,小编觉得很优秀,欢迎点击阅读原文,支持原创作者,如有侵权,恳请联系小编删除,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

TimeoutException导致手机重启案例分析_第7张图片

点击阅读原文,为大佬点赞!

你可能感兴趣的:(TimeoutException导致手机重启案例分析)