2011-01-20 73 views
0

我通過與Thread.setDefaultUncaughtExceptionHandler回調一起運行的代碼從客戶端收集崩潰日誌。Android OutOfMemoryErrors似乎不會立即終止活動 - 爲什麼?

在我沒有附上設備ID與我的上傳,但現在我,我看到一些非常奇怪的報告。實質上,在1-2分鐘的時間範圍內,我看到50個左右的崩潰日誌全部由同一客戶端上傳,有時在同一秒內報告兩個或更多日誌。

我假設一個setDefaultUncaughtExceptionHandler父線程產生的線程也使用處理程序,因此一旦發生第一個級聯效應,會發生一次觸及所有應用程序線程的地方。也許很多這些線程都能夠在整個應用程序崩潰之前上傳崩潰日誌。但是,我預料到這個例外會導致應用程序終止更快。

下面是一個具體的例子 - 我在45秒的時間內看到這個堆棧〜10次,有時在同一秒內重複出現,我會預料到第一個這樣的異常會完全關閉應用程序,而不會將其拖出:

java.lang.RuntimeException: An error occured while executing doInBackground() 
    at android.os.AsyncTask$3.done(AsyncTask.java:200) 
    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
    at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) 
    at java.lang.Thread.run(Thread.java:1096) 
Caused by: java.lang.OutOfMemoryError 
    at java.lang.AbstractStringBuilder.(AbstractStringBuilder.java:83) 
    at java.lang.StringBuilder.(StringBuilder.java:68) 
    at com.appspot.myapp.util.RestClient.convertStreamToString(RestClient.java:306) 
    at com.appspot.myapp.util.RestClient.executeRequest(RestClient.java:288) 
    at com.appspot.myapp.util.RestClient.Execute(RestClient.java:185) 
    at com.appspot.myapp.GridViewActivity$LoadProfilesTask.doInBackground(GridViewActivity.java:1135) 
    at com.appspot.myapp.GridViewActivity$LoadProfilesTask.doInBackground(GridViewActivity.java:1) 
    at android.os.AsyncTask$2.call(AsyncTask.java:185) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 

有人能解釋的Android時遇到OutOfMemoryError,爲什麼我看到這種行爲會發生什麼?這就好像應用程序繼續徘徊,並將這些錯誤視爲非致命... ...?

謝謝!

回答

0

您是否正在更換默認未捕獲的異常處理程序?

如果是這樣,你的替代品是否會調用停止虛擬機的東西(例如System.exit())?未捕獲的異常不會自動導致整個VM停止。

+0

哦....你能給我一個鏈接,以解釋什麼導致VM停止呢?我只是假設線程中未被捕獲的異常總是會導致android java VM終止。謝謝! – esilver 2011-01-22 18:05:10

0

法登,

在我的代碼,我存儲在這裏默認的異常處理程序:

this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler(); 

然後,我已經完成了上傳的異常信息到我的服務器後,我調用默認的異常處理程序:

defaultUEH.uncaughtException(t, e); 

這裏給出的這些行代碼,您鏈接到上面:

84    } finally { 
    85     // Try everything to make sure this process goes away. 
    86     Process.killProcess(Process.myPid()); 
    87     System.exit(10); 
    88    } 

對於我的代碼如何繼續運行在OutOfMemoryErrors中,我仍然感到困惑。