java.util.concurrent.TimeoutException

參考:

AssetManager.finalize() Timed Out 分析

安卓開發(fā)中遇到的奇奇怪怪的問題(三)

在項(xiàng)目中百匆,我們通常會(huì)遇見各種情況導(dǎo)致的
java.util.concurrent.TimeoutException

#34705 java.util.concurrent.TimeoutException
android.content.res.AssetManager.finalize() timed out after 120 seconds
android.content.res.AssetManager.destroy(Native Method)
#81204 java.util.concurrent.TimeoutException
java.io.FileInputStream.finalize() timed out after 120 seconds
java.lang.Daemons$Daemon.isRunning(Daemons.java:85)
#65204 java.util.concurrent.TimeoutException
android.content.res.AssetManager.finalize() timed out after 120 seconds
java.lang.Daemons$Daemon.isRunning(Daemons.java:89)

一.導(dǎo)致TimeoutException的原因

對(duì)象的析構(gòu)函數(shù)執(zhí)行時(shí)間超過了固定的最大時(shí)間

原理分析

  • Android在啟動(dòng)后會(huì)創(chuàng)建一些守護(hù)進(jìn)程旦袋,其中涉及到該問題的有兩個(gè),分別是FinalizerDaemon和FinalizerWatchdogDaemon

  • FinalizerDaemon 析構(gòu)守護(hù)線程楔敌。對(duì)于重寫了成員函數(shù)finalize的對(duì)象,它們被GC決定回收時(shí),并沒有馬上被回收郁轻,而是被放入到一個(gè)隊(duì)列中,等待FinalizerDaemon守護(hù)線程去調(diào)用它們的成員函數(shù)finalize文留,然后再被回收好唯。

  • FinalizerWatchdogDaemon析構(gòu)監(jiān)護(hù)守護(hù)線程。用來監(jiān)控FinalizerDaemon線程的執(zhí)行燥翅。一旦檢測那些重寫了finalize的對(duì)象在執(zhí)行成員函數(shù)finalize時(shí)超出一定時(shí)間骑篙,那么就會(huì)退出VM。

  • 如果是FinalizerDaemon進(jìn)行對(duì)象析構(gòu)時(shí)間超過了MAX_FINALIZE_NANOS(這里是10s)森书,F(xiàn)inalizerWatchdogDaemon進(jìn)行就會(huì)拋出TimeoutException

二.異常出現(xiàn)的場景

在回收對(duì)象時(shí)靶端,設(shè)備進(jìn)入休眠狀態(tài),導(dǎo)致對(duì)象回收的結(jié)束時(shí)間和開始時(shí)間相差太久凛膏。

  1. 當(dāng)你的應(yīng)用處于后臺(tái)杨名,有對(duì)象需要釋放回收內(nèi)存時(shí)

  2. 記錄一個(gè)start_time 然后是FinalizerDaemon 開始析構(gòu)AssetManager對(duì)象

  3. 在這個(gè)過程中,設(shè)備突然進(jìn)入了休眠狀態(tài)猖毫,析構(gòu)執(zhí)行被暫停

  4. 當(dāng)過了一段時(shí)間台谍,設(shè)備被喚醒,析構(gòu)任務(wù)被恢復(fù)吁断,繼續(xù)執(zhí)行典唇,直至結(jié)束

  5. 在析構(gòu)完成后,得到一個(gè)end_time

  6. FinalizerWatchdogDaemon 對(duì)end_time與start_time進(jìn)行差值對(duì)比胯府,發(fā)現(xiàn)超過了MAX_FINALIZE_NANOS介衔,于是就拋出了TimeOut異常

三. 解決方法

方法一

使用反射讓FinalizerWatchdogDaemon線程不執(zhí)行

public static void fix() {
    try {
        Class clazz = Class.forName("java.lang.Daemons$FinalizerWatchdogDaemon");

        Method method = clazz.getSuperclass().getDeclaredMethod("stop");
        method.setAccessible(true);

        Field field = clazz.getDeclaredField("INSTANCE");
        field.setAccessible(true);

        method.invoke(field.get(null));

    }
    catch (Throwable e) {
        e.printStackTrace();
    }
}

注意一點(diǎn):
andriod 9.0不能防偽標(biāo)非SDK接口中的限制接口,但是
以上接口并不屬于限制接口骂因,可以正常訪問

方法二

在自定義UncaughtExceptionHandler中不處理改異常炎咖,這樣因?yàn)樵摦惓Mǔ0l(fā)生在應(yīng)用在后臺(tái)的時(shí)候,且該異常又沒被處理,所以用戶感知不到該異常乘盼。

  override fun uncaughtException(t: Thread, e: Throwable) {
        if(e is TimeoutException){
            return
        }
        mDefaultHandler?.uncaughtException(t,e)
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末升熊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子绸栅,更是在濱河造成了極大的恐慌级野,老刑警劉巖透葛,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狮辽,死亡現(xiàn)場離奇詭異,居然都是意外死亡闸昨,警方通過查閱死者的電腦和手機(jī)风纠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門况鸣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人竹观,你說我怎么就攤上這事镐捧。” “怎么了臭增?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵懂酱,是天一觀的道長。 經(jīng)常有香客問我誊抛,道長列牺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任芍锚,我火速辦了婚禮昔园,結(jié)果婚禮上蔓榄,老公的妹妹穿的比我還像新娘并炮。我一直安慰自己,他們只是感情好甥郑,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布逃魄。 她就那樣靜靜地躺著,像睡著了一般澜搅。 火紅的嫁衣襯著肌膚如雪伍俘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天勉躺,我揣著相機(jī)與錄音癌瘾,去河邊找鬼。 笑死饵溅,一個(gè)胖子當(dāng)著我的面吹牛妨退,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼咬荷,長吁一口氣:“原來是場噩夢啊……” “哼冠句!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起幸乒,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤懦底,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后罕扎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體聚唐,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年壳影,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拱层。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宴咧,死狀恐怖根灯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情掺栅,我是刑警寧澤烙肺,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站氧卧,受9級(jí)特大地震影響桃笙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜沙绝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一搏明、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧闪檬,春花似錦星著、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至样傍,卻和暖如春横缔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背衫哥。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工茎刚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人撤逢。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓膛锭,卻偏偏與公主長得像捌斧,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子泉沾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容