2010-12-14 39 views
2

Bon après-midi.Android DDMS et le suivi des allocations - Identification de ce qui provoque le déclenchement du CPG et pourquoi

J'ai fait une petite application basée sur openGL pour android qui boucle à la normale 60 fps et fait des choses merveilleuses.

J'ai surveillé ma fréquence d'images et j'ai essayé d'optimiser autant que possible en cours de route. J'ai récemment remarqué que pendant que mon programme fonctionne, il y a une légère pause. J'ai immédiatement soupçonné que cela pourrait être le Garbage Collector en cours d'exécution et en regardant dans LogCat il y avait quelques GC suspectes apparaissant autour de l'époque des creux dans les fps.

Cependant, je ne suis pas sûr si c'est mon application qui cause les collectes.

Ce sont donc mes questions au sujet du GC:

1) Quand je me connecter à partir LogCat il contient un PID (identificateur de processus) et est un exemple ici d'un GC typique je reçois:

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

Le 492 est le PID. Est-ce que ce PID va être du processus qui exécute le GC? Ou est-ce un processus en cours sur le téléphone qui a également besoin d'un GC?

Par exemple de la même session ici est un journal de mon application avec log.debug:

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

Le PID pour mon application n'est pas 492, il est 2298. Est-ce que cela signifie que le GC n'a pas été due à mon application?

En utilisant le tracker d'allocation, j'ai très peu d'affectations. Quelques lignes de journalisation entraînant la génération de chaînes et la génération occasionnelle d'un Rect lors de la pression d'un utilisateur (je l'ai réparé de sorte qu'il ne sera alloué qu'une seule fois ...) Je ne vois donc pas comment mon application générera elle-même besoin de GC.

2) Si ce n'est pas mon application allouer loin et est simplement un autre processus qui mange dans la mémoire heureusement devrait-il affecter mon application du tout?

3) Est-ce que le fait même que j'utilise les ddms pourrait causer des GC?

4) Lorsque je regarde dans le tracker d'allocation, il y a des entrées qui ne proviennent pas d'un code que je cours/passe par moi-même. L'un d'entre eux était lié aux statistiques des threads, cela pourrait-il être le ddms?

Désolé, ce sont vraiment plusieurs questions, mais tout est lié à savoir si les journaux du GC que je vois dans mon Logcat sont en fait de mon application ou non. En gardant à l'esprit que pour le moment mon téléphone ne fonctionne pas et que je reçois toujours un petit GC 5 à 15 secondes. Ceux-ci fonctionnent normalement pendant 33ms et semble assez peu de mémoire. Donc, je suppose que cela signifie qu'ils ne me sont pas dus. - Encore une fois essentiellement sur le PID et ce que cela montre.

Répondre

3

Vous avez raison le 1). Seul un sous-ensemble du journal de connexion Logcat appartient à votre application, et ceux-ci ont le pid de votre application.

Il est très probable que les problèmes de hic soient dus à des services d'arrière-plan demandant de petites allocations. Je vous suggère d'appliquer un filtre passe-bas au temps delta entre les images de votre jeu ou de plafonner le FPS maximum pour une expérience globale plus lisse. Même sur iOS, il est extrêmement difficile d'avoir votre jeu à 60FPS sans d'éventuels hoquet.

+0

Merci, je m'en doutais autant que je ne pouvais rien trouver dans la documentation qui répondait tout à fait au petit problème dans mon esprit. – iexus