web-dev-qa-db-fra.com

Le pool d'objets est-il une technique obsolète?

Je connais très bien le concept de pool d'objets et j'essaie toujours de l'utiliser autant que possible.

De plus, j'ai toujours pensé que le pool d'objets est la norme standard car j'ai observé que Java lui-même ainsi que les autres frameworks utilisent le pool autant que possible.

Récemment, j'ai lu quelque chose de complètement nouveau (et contre-intuitif?) Pour moi.

Ce regroupement aggrave en fait les performances du programme, en particulier dans les applications simultanées, et il est conseillé d'instancier des objets new à la place, car dans les JVM plus récentes, l'instanciation d'un objet est très rapide.

J'ai lu ceci dans le livre: Java Concurrency in Practice

Maintenant, je commence à penser si je ne comprends pas quelque chose ici depuis la première partie du livre conseille d'utiliser Executors qui réutilise Threads au lieu de créer de nouvelles instances.

Le pool d'objets est-il devenu obsolète de nos jours?

62
user10326

Il est déconseillé en tant que technique générale, car - comme vous l'avez remarqué - la création et la destruction d'objets de courte durée de vie en soi (c'est-à-dire l'allocation de mémoire et le GC) sont extrêmement bon marché dans les machines virtuelles Java modernes. Ainsi, l'utilisation d'un pool d'objets manuscrits pour vos objets courants est probablement plus lente, plus compliquée et plus sujette aux erreurs que la simple new. *

Cependant, il a toujours ses utilisations pour des objets spéciaux dont la création est relativement coûteuse, comme les connexions DB/réseau, les threads, etc.

*Une fois, j'ai dû améliorer les performances d'une analyse Java app. L'enquête a révélé une tentative d'utiliser un pool d'objets pour allouer des millions d'objets ... et le gars intelligent qui l'a écrit a utilisé un seul global verrouiller pour le rendre sûr thread. Le remplacement de la piscine par un simple new a rendu l'application 30 fois plus rapide.

72
Péter Török

La réponse à la question concrète: "La mise en commun d'objets est-elle une technique obsolète? est:

Non. Le regroupement d'objets est largement utilisé dans des endroits spécifiques - regroupement de threads, regroupement de connexions de base de données, etc.

La création générale d'objets n'a jamais été un processus lent. La mise en commun en soi consomme des ressources - mémoire et puissance de traitement. Toute optimisation est un compromis.

La règle est:

L'optimisation prématurée est mauvaise !!!

Mais quand une optimisation donnée est-elle prématurée?

L'optimisation prématurée est toute optimisation effectuée, avant d'avoir découvert un goulot d'étranglement via une analyse approfondie profilage.

36
Boris Yankov

Dans les situations où vous souhaitez éviter complètement la récupération de place, je pense que le pool d'objets est la seule alternative viable. Donc non, ce n'est absolument pas une technique déconseillée.

9
Jer

Ce regroupement aggrave en fait les performances du programme, en particulier dans les applications simultanées, et il est préférable d'instancier de nouveaux objets à la place, car dans les JVM plus récentes, l'instanciation d'un objet est très rapide.

Dépend du contexte.

8
user204677

Mesure

Cela dépend complètement de votre cas d'utilisation, de la taille de vos objets, de votre JVM, de vos options JVM, du GC que vous avez activé et de toute une série d'autres facteurs.

En bref: mesurez-le avant et mesurez-le après. En supposant que vous utilisez un framework de pool d'objets (comme d'Apache), il ne devrait pas être trop pénible de basculer entre les implémentations.

Conseil de test de performances supplémentaires - laissez la JVM s'échauffer un peu en premier, exécutez les tests sur une JVM en cours d'exécution un certain nombre de fois, elle peut se comporter différemment.

8
Martijn Verburg

Je ne sais pas s'il y a une tendance changeante ici mais ce sera certainement le cas cela dépend. Si votre classe Java gère une ressource externe, telle qu'une connexion RMI ou le chargement d'un fichier de ressources, etc.), les coûts d'instanciation d'objet peuvent certainement être élevés (bien que ces ressources puissent être regroupées pour vous déjà!). En tant que pratique générale, je suis d'accord avec le livre.

5
Jeremy