SWT 重啓案例分析(四)


極力推薦文章:歡迎收藏
Android 乾貨分享

本篇文章主要介紹 Android 開發中的部分知識點,通過閱讀本篇文章,您將收穫以下內容:

一、TimeoutException 導致系統重啓Log
二、TimeoutException 重啓 trace 分析
三、TimeoutException 導致的重啓解決方案

一、TimeoutException 導致系統重啓Log

二、TimeoutException 重啓 trace 分析

從重啓的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;

至此,本篇已結束,如有不對的地方,歡迎您的建議與指正。同時期待您的關注,感謝您的閱讀,謝謝!

如有侵權,請聯繫小編,小編對此深感抱歉,屆時小編會刪除文章,立即停止侵權行爲,請您多多包涵。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章