本篇文章主要介绍 ​​Android​​ 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:


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


一、TimeoutException 导致系统重启Log

SWT 重启案例分析(四)_java

TimeoutException 导致系统重启

SWT 重启案例分析(四)_重启_02

Systemserver TimeoutException

二、TimeoutException 重启 trace 分析

SWT 重启案例分析(四)_重启_03

1090 线程 被线程134 held

SWT 重启案例分析(四)_java_04

线程134 被线程 92 held

SWT 重启案例分析(四)_ide_05

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

从重启的​​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;

SWT 重启案例分析(四)_重启_06

SWT 重启案例分析(四)_java_07