Warte auf gleichzeitige GC blockiert

8

Wenn ich meine Anwendung auf dem Emulator starte, zeigt das Logcat folgendes an:

%Vor%

und das geht weiter, bis ich die Anwendung beende.Ein Vorschlag? Danke

    
melib 22.04.2013, 16:28
quelle

4 Antworten

6

Scheint als würdest du viele neue Objekte erstellen und sie bald wegwerfen.

Für WAIT_FOR_CONCURRENT_GC siehe: Was bedeutet WAIT_FOR_CONCURRENT_GC?

Es bedeutet, dass Sie versuchen, Speicher zuzuordnen (z. B. Objekterstellung) und es nicht in den Speicher passt. Das ist, was GC_CONCURRENT freigegeben durch verursacht wird. Es ist nur übliche Müllsammlung.

Wenn Sie Leistungsprobleme haben, versuchen Sie, Objekte wiederzuverwenden oder zu verschonen.

    
luxer 22.04.2013 16:40
quelle
2

Dies bedeutet, dass Sie zu viele Operationen ausführen und viel Speicher verwendet wird. Daher wird GC (Garbage Collector) aufgerufen, um Speicher freizugeben.

  

04-22 16: 21: 30.685: D / dalvikvm (967): GC_CONCURRENT befreit 1545K, 20%   frei 7019K / 8720K, pausiert 78ms + 17ms, insgesamt 360ms

freed gibt an, wie viel Speicher freigegeben wurde

GC_CONCURRENT Wird aufgerufen, wenn der Heap zu groß wird, um einen Überlauf zu verhindern.

pausiert 78ms + 17ms - zeigt an, wie viel Zeit der GC benötigt hat, um die Sammlung zu beenden.

Siehe

Ergänzen Sie zusätzlich den Speicherauszug und analysieren Sie das Dump-MAT-Tool.

    
Sunny Kumar Aditya 22.04.2013 16:35
quelle
2

Manchmal passiert es, wenn Sie eine endlose Schleife haben, nur weil eine Bedingung immer wahr ist.

Versuchen Sie herauszufinden, ob es in diesem Fall zuerst ist, weil es hauptsächlich deswegen passiert.

    
My God 16.08.2013 15:07
quelle
1

Stimmen Sie hauptsächlich mit @luxer überein, aber ich glaube nicht, dass Sie zu viele Objekte zuweisen, sondern einige riesige Objekte zuweisen. Wenn Sie auf den Link von @luxer über WAIT_FOR_CONCURRENT_GC verweisen, werden Sie feststellen, dass ein zweiter GC in Ihrer App ausgelöst wird, während gleichzeitig ein GC (der normalerweise ausgelöst wird, wenn die Heapbelegung ein Softlimit erreicht) ausgeführt wird. Der zweite GC konnte von Ihnen explizit ausgelöst worden sein oder weil eine Zuweisung fehlgeschlagen ist. Da Sie nicht angegeben haben, dass Sie System.gc () aufrufen, würde ich davon ausgehen, dass Ihre Zuordnungen fehlschlagen und das System versucht, eine GC durchzuführen.

Also, ja, Sie sollten ernsthaft erwägen, einige riesige Objekte wiederzuverwenden, anstatt sie jedes Mal neu zuzuweisen. Dies ist eine bessere Methode, aber wenn Sie aus irgendeinem Grund nicht in der Lage sind, dies zu tun, können Sie wahrscheinlich die Größe Ihres Heapspeichers erhöhen (indem Sie einen großen Heap setzen) und das kann helfen.

    
layman 08.06.2013 23:53
quelle