2012-05-07 80 views
1
05-07 08:27:16.910: D/dalvikvm(31777): GC_EXTERNAL_ALLOC freed 622K, 41% free 6376K/10695K, external 21288K/22163K, paused 62ms 
05-07 08:27:16.972: D/dalvikvm(31777): GC_FOR_MALLOC freed <1K, 41% free 6376K/10695K, external 21455K/22163K, paused 43ms 
05-07 08:27:16.988: D/skia(31777): Loading ARM decoder... 
05-07 08:27:16.996: D/szipinf(31777): Initializing inflate state 
05-07 08:27:17.003: D/skia(31777): Loading ARM decoder... 
05-07 08:27:17.035: D/szipinf(31777): Initializing inflate state 
05-07 08:27:17.050: D/skia(31777): Loading ARM decoder... 
05-07 08:27:17.113: D/dalvikvm(31777): GC_EXTERNAL_ALLOC freed 181K, 40% free 6441K/10695K, external 21790K/22163K, paused 53ms 
05-07 08:27:17.183: I/dalvikvm-heap(31777): Clamp target GC heap from 32.097MB to 32.000MB 
05-07 08:27:17.183: D/dalvikvm(31777): GC_FOR_MALLOC freed <1K, 40% free 6441K/10695K, external 21958K/22163K, paused 43ms 
05-07 08:27:17.183: D/skia(31777): Loading ARM decoder... 
05-07 08:27:17.238: D/dalvikvm(31777): GC_EXTERNAL_ALLOC freed 5K, 40% free 6477K/10695K, external 21958K/22163K, paused 53ms 
05-07 08:27:17.253: E/dalvikvm-heap(31777): 171600-byte external allocation too large for this process. 
05-07 08:27:17.253: E/GraphicsJNI(31777): VM won't let us allocate 171600 bytes 
05-07 08:27:17.300: I/dalvikvm-heap(31777): Clamp target GC heap from 32.132MB to 32.000MB 
05-07 08:27:17.300: D/dalvikvm(31777): GC_FOR_MALLOC freed 0K, 40% free 6477K/10695K, external 21958K/22163K, paused 45ms 
05-07 08:27:17.300: D/skia(31777): --- decoder->decode returned false 
05-07 08:27:17.300: D/skia(31777): Loading ARM decoder... 
05-07 08:27:17.363: W/dalvikvm(31777): threadid=13: thread exiting with uncaught exception (group=0x40015560) 
05-07 08:27:17.363: D/dalvikvm(31777): GC_EXTERNAL_ALLOC freed 34K, 40% free 6476K/10695K, external 21958K/22163K, paused 59ms 
05-07 08:27:17.394: E/dalvikvm-heap(31777): 171600-byte external allocation too large for this process. 
05-07 08:27:17.449: I/dalvikvm-heap(31777): Clamp target GC heap from 32.131MB to 32.000MB 
05-07 08:27:17.449: D/dalvikvm(31777): GC_FOR_MALLOC freed 0K, 40% free 6476K/10695K, external 21958K/22163K, paused 45ms 
05-07 08:27:17.464: D/szipinf(31777): Initializing inflate state 
05-07 08:27:17.496: E/GraphicsJNI(31777): VM won't let us allocate 171600 bytes 
05-07 08:27:17.496: D/skia(31777): --- decoder->decode returned false 
05-07 08:27:17.496: W/dalvikvm(31777): threadid=14: thread exiting with uncaught exception (group=0x40015560) 
05-07 08:27:17.496: I/Process(31777): Sending signal. PID: 31777 SIG: 9 
05-07 08:27:17.496: E/AndroidRuntime(31777): FATAL EXCEPTION: AsyncTask #3 
05-07 08:27:17.496: E/AndroidRuntime(31777): java.lang.RuntimeException: An error occured while executing doInBackground() 
05-07 08:27:17.496: E/AndroidRuntime(31777): at android.os.AsyncTask$3.done(AsyncTask.java:200) 
05-07 08:27:17.496: E/AndroidRuntime(31777): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274) 
05-07 08:27:17.496: E/AndroidRuntime(31777): at java.util.concurrent.FutureTask.setException(FutureTask.java:125) 
05-07 08:27:17.496: E/AndroidRuntime(31777): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308) 
05-07 08:27:17.496: E/AndroidRuntime(31777): at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
05-07 08:27:17.496: E/AndroidRuntime(31777): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
05-07 08:27:17.496: E/AndroidRuntime(31777): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
05-07 08:27:17.496: E/AndroidRuntime(31777): at java.lang.Thread.run(Thread.java:1019) 
05-07 08:27:17.496: E/AndroidRuntime(31777): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget 
05-07 08:27:17.496: E/AndroidRuntime(31777): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method) 
05-07 08:27:17.496: E/AndroidRuntime(31777): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:470) 
05-07 08:27:17.496: E/AndroidRuntime(31777): at com.test.kindle.NetworkAsync.doInBackground(NetworkAsync.java:103) 
05-07 08:27:17.496: E/AndroidRuntime(31777): at com.test.kindle.NetworkAsync.doInBackground(NetworkAsync.java:1) 
05-07 08:27:17.496: E/AndroidRuntime(31777): at android.os.AsyncTask$2.call(AsyncTask.java:185) 
05-07 08:27:17.496: E/AndroidRuntime(31777): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 
05-07 08:27:17.496: E/AndroidRuntime(31777): ... 4 more 

爲什麼我收到的VM won't let us allocate 171600 bytes消息和java.lang.OutOfMemoryError: bitmap size exceeds VM budget崩潰時GC消息把我在〜40%免費的嗎?Android的混亂碰撞

+1

我不能確定沒有鑽入源再次,但我似乎記得有一個單獨的內存區域的未壓縮位圖,它不會從你的「主」堆中竊取。 – Delyan

回答

2

瀏覽the source之後,似乎位圖被分配到由Dalvik管理的外部堆上。

因此,您應該查看日誌中報告的「外部」尺寸,這些尺寸確實將其關閉。

除了像確保您在任何位圖上撥打recycle()這樣的一般建議,我懷疑我們可以爲您提供更多幫助。

+1

當我刪除一個附有位圖的視圖時,如果所有引用都轉到了這些位圖,我該如何回收這些位圖? – Jacksonkr

+1

ImageView應該在其銷燬時回收Bitmap。或者,保留對位圖的引用並顯式回收它(我不確定ImageView是在'dispose()'還是'destroy()'中執行它,這是一個巨大的差異)。 – Delyan

+1

每當該視圖被「刪除」時,位圖會自動回收(可能是由於'inPurgeable = true'?)。此外,我將'inSampleSize'更改爲'2',這在內存使用方面確實令人驚歎。 – Jacksonkr