我通過與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
,爲什麼我看到這種行爲會發生什麼?這就好像應用程序繼續徘徊,並將這些錯誤視爲非致命... ...?
謝謝!
哦....你能給我一個鏈接,以解釋什麼導致VM停止呢?我只是假設線程中未被捕獲的異常總是會導致android java VM終止。謝謝! – esilver 2011-01-22 18:05:10