
极力推荐文章:欢迎收藏
Android 干货分享

阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android
本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:
一、TimeoutException 导致系统重启Log
二、TimeoutException 重启 trace 分析
三、TimeoutException 导致的重启解决方案
一、TimeoutException 导致系统重启Log


二、TimeoutException 重启 trace 分析



从重启的Jave Exception trace看由于在ART GC时,如果检查到某个对象其所属的类型override了finalize函数,会把这个对象添加到referenceQueue中。
referenceQueue被FinalizerDaemon线程监控,如果里面有内容,就会逐个取出并调用其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.java 中CONTENT_PROVIDER_PUBLISH_TIMEOUT 的时间。
ActivityMangerService类路径如下:
frameworksaseservicescorejavacomandroidserveramActivityMangerService.java
static final int CONTENT_PROVIDER_PUBLISH_TIMEOUT = 10*1000;
修改为
static final int CONTENT_PROVIDER_PUBLISH_TIMEOUT = 15*1000;
至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!
