極力推薦文章:歡迎收藏
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;
至此,本篇已結束,如有不對的地方,歡迎您的建議與指正。同時期待您的關注,感謝您的閱讀,謝謝!
如有侵權,請聯繫小編,小編對此深感抱歉,屆時小編會刪除文章,立即停止侵權行爲,請您多多包涵。