100 votes

Existe-t-il une utilisation pratique pour les références faibles?

Dupliquer possible:
Les références faibles - sont-elles utiles?

Etant donné que le ramasse-miettes peut réclamer des références faibles à tout moment, y a-t-il une raison pratique de les utiliser?

50voto

Peter Lawrey Points 229686

Si vous souhaitez conserver une référence à quelque chose d'aussi longtemps qu'il est utilisé ailleurs par exemple, un Auditeur, vous pouvez utiliser une référence faible.

WeakHashMap peut être utilisé comme une courte durée cache de clés de données dérivées. Il peut également être utilisé pour garder des informations sur les objets utilisés ailleurs et vous ne savez pas quand ces objets sont jetés.

BTW Doux Références sont comme des références Faibles, mais ils ne seront pas toujours être nettoyés immédiatement. Le GC toujours jeter références faibles quand il peut et de conserver Doux Références quand il peut.

Il existe un autre type de référence, un Fantôme de Référence. Il est utilisé dans la GC processus de nettoyage et se réfère à un objet qui n'est pas accessible à la "normale" code à cause de son dans le processus d'être nettoyé.

31voto

Eric Lippert Points 300275

Depuis la faiblesse de référence peut être réclamé par le garbage collector, à tout moment, est-il une raison pratique à utiliser?

Bien sûr, il ya des raisons d'ordre pratique à utiliser. Ce serait drôlement étrange si le cadre concepteurs ont l'énorme dépense de la construction d'une faiblesse du système de référence qui est impossible, vous ne pensez pas?

Je pense que la question que vous souhaitez poser est:

Ce sont des situations concrètes dans lesquelles les gens utilisent les références faibles?

Il y a beaucoup de. Une commune est d'atteindre un objectif de performance. Lorsque le réglage des performances d'une application souvent, on doit faire un compromis entre l'utilisation de la mémoire et plus de temps d'utilisation. Supposons, par exemple, est un calcul complexe que vous devez effectuer de nombreuses fois, mais le calcul est "pure", la réponse ne dépend que des arguments, pas sur exogène de l'état. Vous pouvez construire un cache-une carte à partir de la arguments pour le résultat, mais que puis utilise la mémoire. Vous pourriez ne jamais poser de nouveau la question, et que la mémoire est serait alors perdu.

La faiblesse des références peut-être résoudre ce problème; le cache peut être assez grande, et donc de gagner du temps et si la même question est posée à maintes reprises. Mais si le cache est assez grande pour que le garbage collector besoins pour récupérer de l'espace, il peut le faire en toute sécurité.

L'inconvénient est bien sûr que le nettoyage de la politique du garbage collector est réglé pour atteindre les objectifs de l'ensemble du système, pas votre problème de cache. Si le GC en matière de politiques et de votre choix de politique de cache sont suffisamment alignés ensuite références faibles sont très solution pragmatique à ce problème.

13voto

sqrfv Points 1410

Nous l'utilisons pour cette raison - dans notre exemple, différents auditeurs doivent s'inscrire auprès d'un service. Le service conserve les références faibles aux auditeurs, tandis que les classes instanciées conservent les références fortes. Si, à un moment quelconque, les classes sont classées par GC, la référence faible est tout ce qui reste des auditeurs, qui le seront également. Cela facilite beaucoup le suivi des classes intermédiaires.

8voto

Bohemian Points 134107

L'utilisation la plus courante de la faiblesse des références pour les valeurs dans "recherche" des Cartes.

Avec la normale (dur) de la valeur des références, si la valeur de la carte n'a plus de références à celui-ci d'ailleurs, souvent, vous n'avez pas besoin de la recherche. Avec faiblement référencé les valeurs de la carte, une fois qu'il n'y a pas d'autres références, l'objet devient un candidat pour la collecte des ordures

Le fait que la carte elle-même a un (seul) une référence à l'objet ne cesse pas d'être des ordures collectées, car la référence est une faiblesse de référence

3voto

Óscar López Points 97105

Pour éviter les fuites de mémoire, consultez cet article pour plus de détails.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X