2013-04-22 16 views
8

Wenn ich meine Anwendung auf Emulator laufen die Logcat zeigt dies:Warten für die gleichzeitige GC blockiert

04-22 16:21:30.685: D/dalvikvm(967): GC_CONCURRENT freed 1545K, 20% free 7019K/8720K, paused 78ms+17ms, total 360ms 

04-22 16:21:30.685: D/dalvikvm(967): WAIT_FOR_CONCURRENT_GC blocked 143ms 
04-22 16:21:31.845: D/dalvikvm(967): GC_CONCURRENT freed 1552K, 20% free 7019K/8720K, paused 116ms+18ms, total 554ms 

04-22 16:21:31.845: D/dalvikvm(967): WAIT_FOR_CONCURRENT_GC blocked 268ms 
04-22 16:21:32.435: D/dalvikvm(967): GC_CONCURRENT freed 1545K, 20% free 7019K/8720K, paused 75ms+9ms, total 192ms 

04-22 16:21:32.435: D/dalvikvm(967): WAIT_FOR_CONCURRENT_GC blocked 73ms 
04-22 16:21:32.945: D/dalvikvm(967): GC_CONCURRENT freed 1552K, 20% free 7019K/8720K, paused 75ms+10ms, total 209ms 

04-22 16:21:32.945: D/dalvikvm(967): WAIT_FOR_CONCURRENT_GC blocked 70ms 
04-22 16:21:33.434: D/dalvikvm(967): GC_CONCURRENT freed 1545K, 20% free 7019K/8720K, paused 78ms+12ms, total 192ms 

und dies wird fortgesetzt, bis ich die application.Any Vorschlag verlassen Dank

Antwort

2

Das heißt, Sie tun? zu viele Operationen und viel Speicher wird verwendet. 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, total 360ms

befreit gibt an, wie viel Speicher wurde freigegeben

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 Erfassung zu beenden.

Refer

Zusätzlich Speicherabbild nehmen und das Dump Verwendung MAT-Tool analysieren.

6

Scheint wie Sie viele neue Objekte erstellen und sie bald wegwerfen.

Für WAIT_FOR_CONCURRENT_GC dies einen sehen: what does WAIT_FOR_CONCURRENT_GC blocked mean?

Es bedeutet, dass Sie versuchen, Speicher zuweisen (zum Beispiel Objekterstellung) und sie paßt nicht in dem Speicher. Das ist, was GC_CONCURRENT freigegeben durch verursacht wird. Es ist nur die übliche Müllsammlung.

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

1

Stimmen Sie hauptsächlich mit @luxer überein, aber ich glaube, dass Sie nicht zu viele Objekte zuweisen, aber Sie einige riesige Objekte zuweisen. Wenn Sie auf den Link von @luxer über WAIT_FOR_CONCURRENT_GC verweisen, werden Sie feststellen, dass in Ihrer App ein zweiter GC 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 zuzuordnen. 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.

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, wie es vor allem deshalb passiert.

Verwandte Themen