SWT 重启案例分析(四)
极力推荐文章:欢迎收藏
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
类路径如下:
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;
至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!