2010-09-29 33 views
7

我在這裏有一個應用程序,它具有在地圖上顯示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) 
+0

我從我的用戶有操作系統版本1.5,2.1和2.2的相同的錯誤報告。 Stacktrace沒有通過我的代碼,所以我無法捕捉到這個錯誤 - 應用程序完成與FC。 – tomash 2010-09-29 12:26:07

+0

它看起來像一個碎片問題。這就像我的應用程序有一些內存泄漏,它遍佈我的堆內存區域傳播小塊數據。我猜想在Dalvik的下一個版本中可以改進這種行爲,因爲它可能不是一個錯誤,但肯定它不是一個「好行爲」,因爲你實際上有內存,但系統由於其碎片而無法使用。那麼,我會繼續嘗試看看可以做些什麼。 – 2010-09-29 15:20:17

+0

我知道這個問題已經過了一年多了,因爲這個問題被問到,但是有一個針對這個問題正在開發的解決方案?我是curiuos。提前致謝! – Ahmed 2011-10-18 16:29:09

回答

1

我一直在和關閉在過去一個月運行到這個問題。我在代碼中解決了這個問題的方式是強制GC清除我已包裝在WeakReferences中的未引用位圖。這種方法可能不適用於你,因爲你上面粘貼的崩潰似乎源於MapView。無論如何,嘗試在代碼中的關鍵位置上調用一些System.gc()調用,並觀察系統日誌以查看GC_EXPLICIT消息是否指示釋放大量對象/字節。在我正在處理的代碼中,我不得不在我的Adapter.getView()方法的末尾添加一個System.gc(),以確保在下次調用getView()時清除未使用的位圖。這種方法似乎大大減少了我的運行在可怕的java.lang.OutOfMemoryError:位圖大小超過VM預算崩潰。

+0

調用System.gc()不應該幫助OOME。 VM首先嚐試運行GC本身之前不會通過OOME。另外,System.gc()對碎片沒有任何作用。 – 2010-12-18 16:03:31

+0

這些OOME錯誤在Galaxy家族的手機上傾向於更頻繁地發生,例如:Nexus One和Nexus S.我沒有太多地使用Galaxy Nexus來檢查這個問題是否與其他手機相比在這部手機上更多地發生。就我所知,拋出GC調用來清理內存以及仔細編碼是避免此問題的最佳方法。人們也可以捕獲異常(作爲Throwable),並至少防止應用程序強行關閉。但不幸的是,我不確定這個問題是否有明確的解決方案...... – 2012-03-05 10:34:48

1

我一直有這個EXACT相同的問題,我醃一些System.GC調用的代碼,它似乎有一點幫助,但這仍然發生。

我也遇到了另一個問題,這可能與地圖翻轉時出現的所有隨機問題有關,當你縮放時。這往往會在碰撞之前發生。

這一切都只發生在HTC Desire上,我相信它和Nexus One是一樣的手機。 (在許多方面也類似EVO,它也受到它的影響)。

注意:在我們的Arc-S,Galaxy V1,AVD模擬器和華碩平板電腦上它工作得很好。

1

我有同樣的問題,添加以下行清單文件下的應用程序標籤

機器人:largeHeap =真。這對我工作

+0

它提高了崩潰率,但並未完全解決問題。 – 2015-08-19 05:51:22

+0

這基本上是一個備份解決方案,如果完全沒有任何工作。 – 2015-08-19 06:43:44