Je recommande de ne pas utiliser de pools de mémoire pour autre chose qu'une ressource externe très coûteuse à mettre en place, comme une connexion à une base de données ou un thread. Les GC sont très efficaces pour traiter des objets de courte durée, donc créer et supprimer (oubli) des objets est très efficace.
La création de nouveaux éléments et le maintien des anciens éléments en vie entraînent des coûts associés. La mise en place des champs (affectation de valeur) sera similaire dans les deux cas, ce que vous devez comparer sont les autres coûts associés.
Pour un objet nouvellement alloué, le deuxième coût est, bien, l'allocation de mémoire. L'environnement de mémoire gérée Java avec les garbage collectors actuels est vraiment efficace dans l'allocation de la mémoire. En comparant avec C/C++ où le système d'exploitation doit trouver le bloc de mémoire approprié à assigner, le GC générationnel garantit que la mémoire est contiguë et que cette allocation est vraiment rapide. Dans certaines implémentations Java 1.4, il était nécessaire de prendre moins de 10 instructions CPU. La désallocation des jeunes objets (ceux qui ne passent pas par le premier passage du GC) est également rapide: ils sont simplement ignorés - à moins qu'ils n'aient des finaliseurs, ce qui devrait être évité autant que possible. D'autre part, les jeunes objets qui survivent aux passages GC doivent être déplacés dans chaque cycle GC d'une partie de la mémoire à l'autre. Cela peut arriver plusieurs fois avant que l'objet ne soit considéré comme assez vieux pour se déplacer dans les générations plus anciennes, où il y a des chances qu'il bouge moins (il peut encore se déplacer dans un GC de compactage sur les anciennes générations).
Un autre problème avec les objets à vie longue est qu'ils ne peuvent pas avoir de références dans des objets de génération plus jeune. Lorsque cela se produit (attribuez new X()
à un ancien objet), l'objet de longue durée doit être réaffecté à la nouvelle génération, ce qui peut également impliquer des coûts, car il peut nécessiter de déplacer l'objet de l'ancienne génération vers la nouvelle génération. Laisser un trou dans la mémoire de l'ancienne génération qui pourrait forcer les objets en mouvement dans la GC de l'ancienne génération à fonctionner en mémoire compacte.
Dans l'ensemble, l'important est qu'il y a beaucoup de gens très intelligents qui travaillent dans les langages, les compilateurs et les éboueurs. Toutes ces personnes vont travailler pour améliorer la performance des idiomes les plus communs, et essayer de déjouer le système vous mettra probablement hors du chemin où les choses vont doucement et doucement.
En outre, avoir la classe autour seulement quand nécessaire empêchera probablement tous les bogues subtils. – gpampara