7
votes

Comment réduire les frais de performance de la collecte des ordures

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?

J'ai de nombreux arraylistes à vie courte et de longue durée qui ne meurent que lorsque l'application s'arrête.


5 commentaires

Afficher un exemple de votre utilisation de ArrayList .


Et qu'est-ce que dans 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.


4 Réponses :


5
votes

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é).

Si vous utilisez ArrayList avec des types de valeur, essayez de passer à la liste .


4 commentaires

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



1
votes

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.


0 commentaires

0
votes

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.

Sans détails supplémentaires, il est difficile de donner une bonne recommandation.


0 commentaires

8
votes

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.

  • Évitez d'avoir de nombreux objets avec des finaliseurs. Les finaliseurs imposent des travaux supplémentaires sur le collecteur des ordures, car un objet avec un finaliseur doit être collecté deux fois.
  • Évitez la "crise de la Midlife". Le gc .NET (sur le bureau) est générationnel GC. Lorsque l'objet survit à la première collection, mais «meurez» peu de temps après, le GC a fait beaucoup de travail pour rien. (Faire face à la deuxième génération, recueillant à nouveau, etc.). Essayez donc d'optimiser la durée de vie des objets d'une manière qu'ils meurent de manière très rapide ou survivent pendant une longue période.
  • Réduit les allocations inutiles. Par exemple, en utilisant judicy de type de valeur. Ou faire le travail de manière moins intensive de mémoire.

    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.

    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.

    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?

    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.


3 commentaires

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.