我在這裏有一個應用程序,它具有在地圖上顯示POI的功能。它只是一個POI,它只在實際位於可見屏幕區域內時才繪製。它完美的工作了一段時間,但如果我玩弄放大和縮小和拖動,它最終會崩潰。根據Logcat,原因總是OutOfMemory錯誤。使用Google Maps API時內存不足錯誤
起初,我認爲這是Google Maps API上的一個錯誤。經過一番研究並看到一些羅曼蓋伊的帖子後,我確信我在我的應用程序上做了一些愚蠢的事情,導致我時不時發現內存不足。 然後我用堆分析器(Eclipse)運行了一些更詳細的測試,我發現即使我有2+,有時候剩餘3個MB剩餘的空閒內存,我仍然收到由OutOfMemoryError引起的令人討厭的強制關閉消息。大多數情況下,當試圖分配一些614kb的內存塊時會崩潰,而不管我剩下多少內存。
這個問題在Nexus One 2.2.1和HTC Evo 2.1上發生了很多。經過一些小測試後,我在G1 1.6和三星Galaxy S i9000 2.1上都沒有發生故障。但我無法確定G1和Galaxy在更多測試後不會出現這個問題。
我只能想到一個內存碎片問題。我希望這個問題有一個解決方案。我也會很高興,如果我能趕上這個錯誤,並防止應用程序崩潰。
如果有幫助,這裏的logcat的:
09-29 08:58:06.661: ERROR/dalvikvm-heap(1552): 648000-byte external allocation too large for this process.
09-29 08:58:06.661: ERROR/dalvikvm(1552): Out of memory: Heap Size=9991KB, Allocated=6980KB, Bitmap Size=14510KB
09-29 08:58:06.661: ERROR/(1552): VM won't let us allocate 648000 bytes
09-29 08:58:06.672: DEBUG/AndroidRuntime(1552): Shutting down VM
09-29 08:58:06.672: WARN/dalvikvm(1552): threadid=3: thread exiting with uncaught exception (group=0x4001b390)
09-29 08:58:06.672: ERROR/AndroidRuntime(1552): Uncaught handler: thread main exiting due to uncaught exception
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at android.graphics.Bitmap.nativeCreate(Native Method)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at android.graphics.Bitmap.createBitmap(Bitmap.java:569)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at com.google.android.maps.ZoomHelper.createSnapshot(ZoomHelper.java:422)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at com.google.android.maps.ZoomHelper.beginZoom(ZoomHelper.java:186)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at com.google.android.maps.MapView$2.onScaleBegin(MapView.java:371)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at android.view.ScaleGestureDetector.onTouchEvent(ScaleGestureDetector.java:208)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at com.google.android.maps.MapView.onTouchEvent(MapView.java:646)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at android.view.View.dispatchTouchEvent(View.java:3709)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:874)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1701)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1116)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at android.app.Activity.dispatchTouchEvent(Activity.java:2068)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1685)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at android.view.ViewRoot.handleMessage(ViewRoot.java:1708)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at android.os.Handler.dispatchMessage(Handler.java:99)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at android.os.Looper.loop(Looper.java:123)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at android.app.ActivityThread.main(ActivityThread.java:4595)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at java.lang.reflect.Method.invokeNative(Native Method)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at java.lang.reflect.Method.invoke(Method.java:521)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at dalvik.system.NativeStart.main(Native Method)
我從我的用戶有操作系統版本1.5,2.1和2.2的相同的錯誤報告。 Stacktrace沒有通過我的代碼,所以我無法捕捉到這個錯誤 - 應用程序完成與FC。 – tomash 2010-09-29 12:26:07
它看起來像一個碎片問題。這就像我的應用程序有一些內存泄漏,它遍佈我的堆內存區域傳播小塊數據。我猜想在Dalvik的下一個版本中可以改進這種行爲,因爲它可能不是一個錯誤,但肯定它不是一個「好行爲」,因爲你實際上有內存,但系統由於其碎片而無法使用。那麼,我會繼續嘗試看看可以做些什麼。 – 2010-09-29 15:20:17
我知道這個問題已經過了一年多了,因爲這個問題被問到,但是有一個針對這個問題正在開發的解決方案?我是curiuos。提前致謝! – Ahmed 2011-10-18 16:29:09