Mon profilage d'application montrant une grande collecte des ordures aériennes. Le profileur n'a pas d'exercice dans la collection des ordures. Que dois-je faire pour réduire ces frais généraux? P>
J'ai de nombreux arraylistes à vie courte et de longue durée qui ne meurent que lorsque l'application s'arrête. P>
4 Réponses :
Si vous avez trop de frais de collecte des ordures, réduisez vos ordures. Essayez de réutiliser des listes (prévenez et utilisez-les, effacez-les lorsque vous avez terminé). p>
Si vous utilisez ArrayList avec des types de valeur, essayez de passer à la liste
certainement le cas le plus probable :)
@Chaospandion: Sauf si, bien sûr, ils travaillent sur une plate-forme (semi-) non standard. Par exemple, le GC sur Xbox360 dans XNA a tendance à avoir des problèmes très fréquemment ...
@Reed: Si cela est pour XNA, l'OP devrait certainement l'avoir dit. W / o une telle indication que vous ne pouvez supposer que le cadre "normal".
Quels% de la surcharge globale de la performance GC est considéré comme plus ?? Le profileur montre un certain% pour GC mais n'indique pas quelle partie du code provoque une charge supplémentaire pour cela. Je n'ai pas beaucoup utilisé les profilers, peut être des indices peuvent m'aider à réduire la cause réelle
Si la collecte des ordures La surcharge devient un problème de performance sérieux, vous devez examiner votre conception et re-évaluer la quantité d'objets de courte durée que vous créez. p>
Si cette application fonctionne comme un service ou effectue une grande quantité de travail avant de retourner à l'interface utilisateur, vous devrez peut-être modifier votre modèle de collecte des ordures. P>
Sans détails supplémentaires, il est difficile de donner une bonne recommandation. P>
Bien essentiellement, vous devriez réduire le travail pour le collecteur des ordures. Il y a un certain «modèles» qui produisent beaucoup de travail. P>
Donc, dans votre cas, je suppose que vous avez soit une "crise de Midlife'-crise avec les listes de courte durée. Ou votre simple liste d'allouer comme fou. p>
Dans le premier cas: essayez de faire la durée de vie des listes plus courtes. Je ne peux pas vous dire comment la solution ressemble à votre application. P>
Dans le deuxième cas: Essayez d'éviter d'attribuer de nombreuses listes. Peut-être que vous pouvez utiliser des types de valeur appropriés? Ou des tableaux de taille fixe? Ou modifier la structure du code de manière à ce que moins de listes soient nécessaires? P>
Quoi qu'il en soit, je vous recommanderais de profiler votre candidature et de rechercher la quantité de mémoire que vous allouez et combien peuvent être collectés dans la première génération. P>
Une plage de courte durée est celle où une liste est créée nouvelle () dans une fonction? Et par conséquent dépasse de la portée et devenir éligible à la collecte une fois la fonction hors de portée? ou la longueur de la fonction importe également? Si la fonction est grande, une arraylist ne peut pas être collectée dans la collection de première génération, même si la fonction a été instanciée à l'intérieur de la fonction?
Ce qui compte, c'est s'il y a toujours une référence à l'objet. La longueur de la fonction n'a presque aucune influence. Bien sûr, lorsque vous avez une méthode réelle longue, qui alloue d'abord l'objet, alors beaucoup d'autres travaux et que l'objet ne dépasse jamais de portée, il est possible que l'objet soit déplacé vers la deuxième génération. Mais avec votre code de tous les jours, cela devrait être un problème.
"Ce qui compte, c'est s'il y a toujours une référence à l'objet." Par objet, vous voulez dire que l'objet conservé par le tableau? Oui, cet objet reste et survivra à la fonction.
Afficher un exemple de votre utilisation de
ArrayList code>.Et qu'est-ce que dans i> les arraylistes et quel genre de cycle de vie cette charge utile a-t-elle?
Il y a 4-5 arraylistes que je nouveau () dans le constructeur. Ensuite, il y a un applyLogic () et je fais un clair () au début. Cette applicationLogic () appelle d'autres fonctions qui remplissent ces arraylistes et transmettent son contenu sur la prise et à la fin de l'applyLogic (), je suis de nouveau effacé () pour la prochaine itération.
Nous avons besoin de plus d'informations (de préférence du code). Quel% est la prise de GC? Combien d'articles sont dans les listes? Quels types sont dans la liste? Combien de travail se passe-t-il? Par exemple, si vous avez une boucle qui ne remplit que quelques listes avec de nombreux objets, appelle une fonction vide et leur retour puis de retourner, puis Course GC consommera une grande partie de votre temps.
obtiendra un exemple de code. Il n'y a pas plus de 4-5 éléments dans chaque liste de matrices, tout le même type. J'ai essayé la liste générique et pour une raison quelconque, il est plus lent que la flambée.