2017-07-05 2 views
0
ReferenceQueue q = new ReferenceQueue(); 
Reference r = q.remove(); 
r.clear(); 

Je vois que le doc java dit que la méthode clear efface cet objet de référence. Je ne comprends pas la signification de ceci. Est-ce clear de la mémoire et donc en d'autres termes, l'objet a été recueilli?Utilisation de clair dans la classe java.lang.ref.Reference

+0

J'ai supprimé ma réponse, car après avoir vu votre commentaire, je suis sûr que je n'ai pas expliqué ce que je voulais correctement. Je vais essayer de faire ça d'une meilleure façon. –

Répondre

0

java.lang.Reference est une classe de base pour quelques références spéciales qui sont traitées de manière spéciale par la récupération de place. Dans certaines circonstances, le garbage collector peut pousser un objet de référence dans sa file d'attente de référence (la référence ne peut être mise en file d'attente qu'une seule fois dans sa durée de vie).

clear() Cette méthode peut être utilisée pour supprimer une gestion spéciale (et donc un travail supplémentaire pour le garbage collector). Si l'objet de référence est déjà en file d'attente, cela n'a pas de sens de l'effacer, il est déjà effacé par le garbage collector.

This project sur github a une implémentation de la gestion des ressources en utilisant PhantomReference à des fins éducatives. clear() est utilisé si la ressource est explicitement éliminée pour éviter un travail supplémentaire pour le GC dans ce cas.

0

clear() définit simplement la référence interne à null. Puisque les références sont automatiquement effacées lorsqu'elles sont mises en file d'attente par le garbage collector (à l'exception des références fantômes, mais que cette bizarrerie peut être ignorée, elles seront éliminées en Java 9), il n'est généralement pas nécessaire d'appeler clear() sur une référence reçue via ReferenceQueue.remove() .

En principe, il y a la possibilité de enqueue références manuellement via enqueue() sans les effacer, mais il y a peu de sens que, comme le but principal de la file d'attente de référence est d'en savoir plus sur les références étant en file d'attente par le collecteur des ordures qui sera effacé.

Lorsque vous appelez clear() sur un objet Reference qui n'a pas encore été en file d'attente, il peut permettre de se référent recueilli sans mise en attente de l'objet Reference. D'un autre côté, lorsque vous n'avez plus besoin de l'objet Reference, vous pouvez laisser la JVM la collecter comme un objet ordinaire, avec le référent s'il n'y a plus d'autres références, car dans ce cas, il ne sera pas mis en file d'attente, rendant inutile clear().