2016-05-19 9 views
1

Error:Uncaught translation error: java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: GC overhead limit exceeded api 19OutOfMemoryError: GC Obergrenze überschritten api 19

Was jetzt?

Dieser Fehler occures nur, wenn ich versuche es auf einem API 19 Emulator laufen zu lassen (wie der Fehlertext als auch sagt). Okay, ich bekomme das anscheinend so, dass meine App erst vor kurzem zu groß wurde ... Oder hast du es getan?

Ich glaube, ich verstehe diesen Fehler nicht wirklich vollständig. Was bedeutet es anderen dann würde ich meine Heap-Größe erhöhen müssen?

Hier kommt die nächste Frage: Ist es schlecht, es zu erhöhen? Kann ich es nur für API 19 erhöhen und es dort lassen, wo es für andere ist, da es z. API 23?

Was kann ich tun, wenn ich es nicht erhöhen möchte? Wie finde ich heraus, was genau das so groß macht? Was kann ich im Allgemeinen tun, um es klein zu halten?

diese sind so viele Fragen, und ihnen gute Moderatoren zu halten von mir zu sagen, nur noch eine Frage zu stellen, ist es hier, die letzte und alles inklusive Frage: Wenn es schlecht ist die Heap-Größe zu erhöhen, Was muss ich tun, um diesen Fehler zu vermeiden?

Antwort

0

Wo bekommen Sie dieses Problem?

Während der Kompilierung oder beim Ausführen Ihrer App?

Im ersten Fall müssen Sie sicherstellen, dass Ihr Heap während der Kompilierungsphase groß ist. Wenn Sie Gradle verwenden, würden Sie etwas zu Ihrem Skript hinzufügen:

dexOptions { 
    javaMaxHeapSize "2g" 
} 

Bei der zweiten - die Fehler tritt auf, wenn Ihre Anwendung ausgeführt wird, werden Sie wahrscheinlich Ihre Anwendung neu zu gestalten müssen, damit es weniger Speicher verbraucht. Sie können die JVM-Parameter der Geräte Ihres Benutzers nicht steuern.

EDIT: Ich weiß nicht, warum es einen Unterschied zwischen den 2 API-Ebenen gibt, aber ich denke, es hat etwas damit zu tun, dass von API 21 eine andere Laufzeit (ART) verwendet wird. Lesen Sie mehr dazu hier: https://developer.android.com/studio/build/multidex.html Die Kompilierungsphase ist wahrscheinlich ein bisschen anders, was zu unterschiedlichen Speicheranforderungen zwischen den API-Ebenen führt.

+0

Ich bekomme es während der Kompilation von Gradle ... Würde 'javaMaxHeapSize" 2g "' nur die Kompilierphase beeinflussen? Oder beeinflusst dies auch die Ausgabe? – Maverick283

+0

Sehen Sie, das ist, wo mein Porblem begraben ist: Ich verstehe nicht, warum Compiling für die Ausführung auf einem api 23 Gerät nicht den gleichen Fehler gibt.Soweit ich verstehe, ist die Ausgabe von allem, was ich kompiliere, egal, für welches Gerät ich es verwende. – Maverick283

+0

Es hat nur Auswirkungen während der Kompilierungsphase, es hat keine Auswirkungen auf die Größe des Heapspeichers der App, wenn es ausgeführt wird. –

0

Soweit ich weiß, gibt es keine Möglichkeit, die Heapsize auf einem echten Handy zu erhöhen, es ist nur möglich, die Heapsize im Emulator zu erhöhen. Die Erfahrung, die ich gemacht habe, ist, dass jedes Gerät seine eigene feste Größe von Heap hat, die von der VM verwendet wird. Ich hatte das gleiche Problem mit einigen meiner Apps, die nicht auf "älteren" Android-/API-Versionen laufen. Ich benutzte mein altes Samsung Galaxy S2, das nur 64MB Heap hat und das kann nicht geändert werden.

Die endgültige Lösung für mich war, meine App zu profilieren und eine Menge Redesign durchzuführen, um den Speicherverbrauch meiner App irgendwie zu reduzieren. Glücklicherweise hat Google schon einiges über dieses Thema geschrieben und wie man es angehen kann. Ich schlage vor, Sie beginnen zu lesen Managing Your App's Memory und Investigating Your RAM Usage. Dort finden Sie alles, um mit dem Profilieren des Speicherverbrauchs Ihrer App zu beginnen.