2010-12-14 4 views
2

Guten Tag.Android DDMS und Allokations-Tracking - Identifizieren, was den GC auslöst und warum

Ich habe eine kleine OpenGL-basierte App für Android, die bei den normalen 60 fps Loops und macht verschiedene wundersame Dinge.

Ich habe meine Bildrate im Auge behalten und versuche, wo es geht, zu optimieren, während ich mitfahre. Ich habe kürzlich festgestellt, dass es während meines Programms manchmal eine kleine Pause gibt. Ich vermutete sofort, dass es der Garbage Collector sein könnte, der lief und in LogCat sah es einige verdächtige GCs, die um die Zeiten der Dips in fps erschienen.

Allerdings bin ich mir nicht sicher, ob es meine App ist, die das Sammeln verursacht.

Das sind also meine Fragen über den GC:

1) Wenn ich von LogCat erhalten Anmeldung enthält einen PID (Prozess-ID) und hier ist ein Beispiel für einen typischen GC i erhalten:

12-14 14:52:40.647: DEBUG/dalvikvm(492): GC_EXPLICIT freed 3831 objects/203576 bytes in 32ms 

Die 492 ist die PID. Wird diese PID zu dem Prozess, der den GC durchführt? Oder läuft ein Prozess auf dem Telefon, der auch einen GC benötigt?

Zum Beispiel aus der gleichen Sitzung ist hier ein Protokoll aus meinem app log.debug mit:

12-14 13:50:42.717: DEBUG/Curve(2298): LIFECYCLE - OnStart 

Die PID für meine Anwendung ist nicht 492, es ist 2298. dies die GC lag nicht bedeutet zu meiner App?

Mit dem Allocation Tracker habe ich nur sehr wenige Zuweisungen. Ein paar Zeilen der Protokollierung, die dazu führen, dass einige Zeichenfolgen generiert werden und gelegentlich ein Rect beim Drücken eines Benutzers erzeugt wird (ich habe dies behoben, so dass es nur noch einmal vergeben wird ...) Ich kann also nicht sehen, wie meine App selbst das generiert Notwendigkeit für GC's.

2) Wenn es nicht meine App ist Zuteilung entfernt und ist einfach ein anderer Prozess, der glücklich in Speicher isst, sollte es meine App überhaupt beeinflussen?

3) Könnte die Tatsache, dass ich die ddms verwende, GCs verursachen?

4) Wenn ich in den Allokations-Tracker schaue, gibt es einige Einträge, die nicht aus irgendeinem Code stammen, den ich selbst durchlaufe/durchlasse. Einer davon war mit Thread-Stats verwandt, könnte dies der ddms sein?

Sorry, wenn das wirklich mehrere Fragen ist, aber es hängt alles damit zusammen, ob die GC-Logs, die ich in meinem Logcat sehe, tatsächlich von meiner Anwendung stammen oder nicht.

Bedenkt, dass im Moment mein Telefon nicht meine App läuft und ich immer noch kleine GC's 5 - 15 Sekunden bekomme. Diese laufen normalerweise für 33ms und scheinen ziemlich kleine Mengen an Speicher zu haben. Also ich denke, das bedeutet, dass sie nicht auf mich zurückzuführen sind. - Noch einmal im Grunde über die PID und was das zeigt.

Antwort

3

Sie haben Recht auf 1). Nur eine Teilmenge der GC Logging-Logdateien gehört zu Ihrer App, und diese haben die PID Ihrer App.

Höchstwahrscheinlich sind die Schluckauf aufgrund von Hintergrunddiensten, die kleine Zuordnungen anfordern. Ich würde vorschlagen, dass Sie einen Tiefpassfilter auf die Delta-Zeit zwischen Frames in Ihrem Spiel anwenden oder die maximale FPS für eine insgesamt flüssigere Erfahrung begrenzen. Selbst auf iOS ist es extrem schwierig, dein Spiel mit 60 FPS laufen zu lassen, ohne dass es zu Schluckauf kommt.

+0

Vielen Dank, ich vermutete so viel, dass ich nichts in der Dokumentation finden konnte, die auf das kleine Niggle in meinem Kopf reagierte. – iexus