2010-09-29 5 views
7

Ho un'applicazione qui che ha una funzione di mostrare un PDI sulla mappa. È solo un POI ed è disegnato solo quando è effettivamente all'interno dell'area dello schermo visibile. Funziona perfettamente per un po ', ma se gioco con lo zoom avanti e indietro e il trascinamento, finirà per bloccarsi. Secondo Logcat, la ragione è sempre un errore OutOfMemory.Errore di memoria insufficiente durante l'utilizzo dell'API di Google Maps

Inizialmente, ho pensato che fosse un errore nell'API di Google Maps. Dopo aver fatto delle ricerche e visto alcuni post di Romain Guy, ero convinto di aver fatto qualcosa di stupido sulla mia app che mi ha tenuto a corto di memoria di tanto in tanto. Poi ho eseguito alcuni test più dettagliati con Heap Analyzer (Eclipse) e ho visto che anche se avevo 2+, a volte 3+ megabyte di memoria libera, ricevevo ancora quei fastidiosi messaggi Force Close causati da OutOfMemoryError. La maggior parte delle volte si blocca quando si tenta di allocare un blocco di memoria da 614 kb, indipendentemente da quanto mi rimane.

Questo problema si verifica molto su Nexus One 2.2.1 e su HTC Evo 2.1. Dopo alcuni piccoli test, non ho avuto alcun crash né su G1 1.6 né su Samsung Galaxy S i9000 2.1. Ma non posso dire con certezza che G1 e Galaxy non mostreranno questo problema dopo ulteriori test.

Posso solo pensare a un problema di frammentazione della memoria. Spero che questo problema abbia una soluzione. Sarò anche felice se riuscirò a rilevare questo errore e a prevenire l'arresto anomalo dell'app.

Se aiuta, ecco il 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

Ho ricevuto le stesse segnalazioni di errore dai miei utenti che hanno OS versione 1.5, 2.1 e 2.2. Stacktrace non passa attraverso il mio codice quindi non riesco a rilevare questo errore - l'applicazione termina con FC. – tomash

+0

Sembra davvero un problema di frammentazione.È come se la mia app avesse una perdita di memoria che diffonde piccoli blocchi di dati in tutta la mia area di memoria heap. Direi che questo tipo di comportamento potrebbe essere migliorato nelle prossime versioni di Dalvik perché potrebbe non essere un bug, ma di sicuro non è un "buon comportamento" dal momento che hai effettivamente memoria, ma il sistema non può essere utilizzato a causa della sua frammentazione. Bene, continuerò a provare a vedere cosa si può fare al riguardo. –

+0

So che è passato più di un anno da quando è stata posta questa domanda ma è stata sviluppata una soluzione per questo problema? Sono curioso Grazie in anticipo! – Ahmed

risposta

1

Sono stato in esecuzione in questo problema e fuori per il mese passato. Il modo in cui ho risolto il problema nel mio codice è quello di forzare il GC a ripulire le bitmap senza riferimento che ho incluso in WeakReferences. Questo approccio potrebbe non funzionare per te dal momento che il crash che hai incollato sopra sembra originarsi in MapView. Indipendentemente da ciò, prova a cospargere alcune chiamate System.gc() in posizioni chiave nel tuo codice e guarda il log del sistema per vedere se i messaggi GC_EXPLICIT indicano molti oggetti/byte liberati. Nel codice su cui sto lavorando, ho dovuto aggiungere un System.gc() alla fine del mio metodo Adapter.getView() per garantire che le bitmap inutilizzate vengano ripulite la prossima volta che viene chiamato getView(). Questo approccio sembra aver drasticamente ridotto il mio run con il java.lang.OutOfMemoryError temuto da : dimensione bitmap supera il crash del budget VM.

+0

chiamando System.gc() non dovrebbe aiutare OOME. la VM non passerà attraverso OOME prima di provare a eseguire il GC stesso. inoltre, System.gc() non fa nulla per la frammentazione. –

+0

Questi errori OOME tendono a verificarsi più frequentemente sui telefoni della famiglia Galaxy come: Nexus One e Nexus S. Non ho usato molto il Galaxy Nexus per verificare se questo problema si verifica anche su questo telefono rispetto agli altri. Lanciare chiamate GC per ripulire la memoria insieme a un'attenta codifica è, per quanto ne so, il modo migliore per evitare questo problema. Si può anche prendere l'eccezione (come un Throwable) e almeno impedire che l'app si chiuda forzatamente. Ma sfortunatamente, non sono sicuro che esista una soluzione definitiva per questo problema ... –

1

Ho avuto questo stesso problema, ho salato il codice con alcune chiamate System.GC e sembrava aiutare un po ', ma questo accade ancora.

Inoltre, sto riscontrando un altro problema che potrebbe essere correlato a quello in cui la mappa sembra capovolgersi e andare casualmente quando pizzichi lo zoom. Questo tende a succedere a volte prima di un incidente.

Questo è tutto ciò che accade solo su un HTC Desire che credo sia lo stesso telefono del Nexus One sotto il cofano. (e simile in molti modi all'EVO che ne soffre anche).

Nota: sta funzionando al 100% sul nostro Arc-S, Galaxy V1, emulatore AVD e tablet Asus.

1

Ho avuto lo stesso problema, aggiungere la seguente riga nel file manifesto sotto tag applicazione

Android: largeHeap = true. Questo ha funzionato per me

+0

migliora il tasso di crash ma non risolve completamente il problema. –

+0

Questa è fondamentalmente una soluzione di backup se assolutamente nulla funziona. –