Guten Tag.
Ich habe eine kleine OpenG-Basis-App für Android erstellt, die mit normalen 60 fps läuft und verschiedene wunderbare Dinge tut.
Ich habe mein Bildrate im Auge behalten und versucht, wo möglich zu optimieren, während ich vorankomme. Ich habe kürzlich bemerkt, dass es während des Betriebs meines Programms manchmal zu einer leichten Pause kommt. Ich vermutete sofort, dass es möglicherweise der Garbage Collector ist, der läuft, und beim Blick in LogCat gab es ein paar Verdächtige GCs, die um die Zeiten der fps-Einbrüche auftraten.
Ich bin mir jedoch nicht sicher, ob es meine App ist, die die Sammlungen veranlasst.
Also dies sind meine Fragen zum GC:
1) Wenn ich eine Protokollierung von LogCat erhalte, enthält es eine PID (Prozess-ID?) Und hier ist ein Beispiel für einen typischen GC, den ich erhalte:
12-14 14:52:40.647: DEBUG/dalvikvm(492): GC_EXPLICIT hat 3831 Objekte / 203576 Bytes in 32ms freigegeben
Die 492 ist die PID. Ist diese PID die des Prozesses, der den GC ausführt? Oder handelt es sich um einen Prozess, der auf dem Telefon läuft und ebenfalls einen GC benötigt?
Zum Beispiel hier ist ein Protokoll aus derselben Sitzung von meiner App, die Log.debug verwendet:
12-14 13:50:42.717: DEBUG/Curve(2298): LEBENSZYKLUS - OnStart
Die PID für meine App ist nicht 492, sondern 2298. Bedeutet das, dass der GC nicht von meiner App verursacht wurde?
Mit dem Allocation Tracker gibt es nur sehr wenige Zuweisungen. Ein paar Protokollzeilen verursachen die Generierung einiger Strings und gelegentlich wird ein Rechteck bei einem Benutzerdruk erzeugt (ich habe dies behoben, damit es jetzt nur einmal zugewiesen wird...). Daher kann ich mir nicht vorstellen, wie meine App selbst den Bedarf an GCs generieren wird.
2) Wenn meine App nicht zuweist und einfach ein anderer Prozess ist, der fröhlich in den Speicher eindringt, sollte es meine App überhaupt beeinflussen?
3) Könnte alleine die Tatsache, dass ich das ddms verwende, GCs verursachen?
4) Wenn ich mir den Allocation Tracker anschaue, gibt es einige Einträge, die nicht aus meinem eigenen Code stammen. Einer davon war mit Thread-Statistiken verbunden, könnte dies das ddms sein?
Entschuldigung, wenn das wirklich mehrere Fragen sind, aber es geht im Wesentlichen darum, ob die GC-Protokolle, die ich in meinem Logcat sehe, tatsächlich von meiner Anwendung stammen oder nicht.
Beachten Sie, dass mein Telefon derzeit nicht meine App ausführt und ich dennoch kleine GCs alle 5 - 15 Sekunden erhalte. Diese laufen normalerweise 33ms und scheinen recht kleine Speichermengen zu sein. Ich nehme also an, dass sie nicht von mir verursacht werden. - Wieder im Grunde genommen über die PID und was das zeigt.