web-dev-qa-db-fra.com

Qu'est-ce que le pool d'objets en Java?

Qu'est-ce que la mise en commun d'objets et qu'est-ce qu'une référence d'objet faible?

Comment pouvons-nous les implémenter en utilisant Java?

27
Himanshu

Un pool d'objets est une collection d'un objet particulier qu'une application va créer et conserver sous la main pour les situations dans lesquelles la création de chaque instance est coûteuse. Un bon exemple serait une connexion à une base de données ou un thread de travail. Le pool vérifie les occurrences des utilisateurs, comme des livres dans une bibliothèque.

Généralement, le regroupement d'objets est géré par un serveur d'applications Java EE. Si vous devez le faire vous-même, utilisez de préférence un pool d’objets d’Apache. N'en écris pas un toi-même; la sécurité des fils et d’autres problèmes peuvent compliquer les choses.

Voici une bonne référence sur les références d'objet faible.

34
duffymo

Vérifier piscines communes

fournit une API de pool d'objets

Il est généralement utilisé pour les objets dont la création est coûteuse. Afin d'éviter de conserver un pool de N objets pré-créés et de les réutiliser.

14
Bozho

Une référence faible est une sorte de variable de référence traitée spécialement par le ramasse-miettes.

Ceci introduit un autre type d'accessibilité, n'importe quel objet peut être:

  • fortement accessible (accessible depuis n'importe quel fil de la vie uniquement par normal references)
  • faiblement accessible (pas fort, mais accessible par une référence faible (ou par de multiples façons, chacune comprenant une référence faible))
  • pas accessible du tout

(Il existe également Références Soft et Références Phantom , que je laisse de côté ici - elles fonctionnent de manière similaire et introduisent davantage de niveaux entre.)

Si un objet n'est pas du tout accessible, il peut être collecté à tout moment . Si un objet est très accessible, il ne peut pas être collecté du tout. ... Si le récupérateur de mémoire détecte qu'un objet est (ou un groupe d'objets) est faiblement accessible (peut-être par plusieurs références faibles), il efface toutes ces références en même temps , puis les objets ne sont pas accessibles (et peuvent être ramassés).

(En réalité, il y a/il peut y avoir une étape de finalisation entre le "non accessible" et la collection, ce qui peut également rendre l'objet à nouveau accessible.)

Pour utiliser les références faibles, vous pouvez utiliser la classe Java.lang.ref.WeakReference - la référence réelle se trouve dans une variable privée de cette classe et ne peut être définie qu'avec le constructeur, puis effacée ultérieurement. Vous pouvez sous-classer cette classe, si vous avez besoin d'autres données que la référence elle-même, qui devraient rester présentes lorsque la référence est effacée.

Pour un pool d'objets au sens de "éviter les instanciations coûteuses", une référence faible n'est pas le bon outil.

6
Paŭlo Ebermann

Un pool d'objets est une collection d'objets qui sont recyclés, plutôt que recréés à chaque fois qu'ils sont nécessaires.

En fonction de vos besoins, vous pouvez implémenter un tel pool d'objets de différentes manières. Les pools d'objets utilisés pour améliorer les performances, même pour des objets simples, mais ne sont pas aussi utiles dans Java 5+. 

Je vous suggère de ne les utiliser que pour les objets qui se connectent à des ressources externes telles que des connexions de fichiers, de sockets ou de bases de données.

4
Peter Lawrey

L'idée du modèle de pool d'objets est similaire à celle de la bibliothèque. Chacun de nous sait qu'il est moins cher et plus facile d'aller dans une bibliothèque emprunter un livre plutôt que de l'acheter. De même, il est moins coûteux (en termes de mémoire système et de vitesse) pour un processus d'emprunter un objet plutôt que de l'instancier. Ainsi, un tel processus dans lequel un processus empruntant un objet à un autre processus est appelé regroupement d'objets.

3
Er.Naved Ali

Mise en commun et mise en commun d'objets:

La mise en commun consiste essentiellement à utiliser les ressources efficacement, en limitant l'accès des objets à la période requise par le client. 

L'augmentation de l'utilisation via la mise en commun augmente généralement les performances du système.
Le regroupement d’objets est un moyen de gérer l’accès à un ensemble fini d’objets entre des clients concurrents.
En d'autres termes, la mise en commun d'objets n'est rien d'autre que le partage d'objets entre différents clients. 

Étant donné que le regroupement d'objets permet le partage d'objets, les autres clients/processus n'ont pas besoin de ré-instancier l'objet (ce qui réduit le temps de chargement). Ils peuvent plutôt utiliser un objet existant.
Après l'utilisation, les objets sont renvoyés au pool. 


Objet de référence faible:  

Une référence faible est un titulaire pour une référence à un objet appelé le référent.
Avec des références faibles, vous pouvez conserver une référence au référent sans l'empêcher d'être collecté.
Lorsque le garbage collector trace le tas, si les seules références en suspens à un objet sont des références faibles, le référent devient un candidat pour GC comme s'il n'y avait aucune référence en attente et que les références faibles en attente sont effacées. 

N'oubliez pas que GC utilise toujours des algorithmes pour récupérer les objets difficilement accessibles.

2
sgokhales

J'ai implémenté un simple ObjectPool en Java, voir iciIl n'utilise cependant pas de référence d'objet faible. Objet de la référence d'objet faible pour permettre de collecter la mémoire d'un objet même s'il existe des références à l'objet, mais elles sont faibles. Il est plus utile pour les caches que pour les pools d'objets, même s'il peut également être utilisé pour eux.

0
Singagirl