Question

Par "libéré", je veux dire qu'il n'y a pas de références au Classloader restant.

Nous rencontrons un problème où une application Java EE fréquemment renvoyée mange l'espace Permgen. L'analyse montre qu'un singleton dans l'application Java EE a transmis des références aux objets d'application-Classloader en dehors de l'application (en violation des règles Java EE) et ne les efface pas lorsque l'application n'est pas exploitée.

En supposant qu'il n'y a pas d'autres références restantes à Singleton ou à l'objet de classe, le Singleton Finalize () sera-t-il appelé lorsque le Classloader de sa classe sera libéré? J'aimerais y effacer les références inférieures aux voyous. Ou suis-je dans un Catch-22 où finaliser ne sera pas appelé tant que le chargeur lui-même peut être collecté aux ordures - et ne sera donc jamais appelé en raison des références externes voyous?

La principale question ici est peut-être:

Un objet de classe sera-t-il collecté aux ordures dans ce cas où son Classloader ne peut pas encore être? Cela peut dépendre de la spécification du comportement de chargeur de classe, ou peut être dépendant de l'implémentation.

Les références (l'autre type !;-)) seraient appréciées, mais ne sont pas nécessaires.

Était-ce utile?

La solution

Une classe avec une référence statique, Will est éligible à la collecte des ordures uniquement, si le chargeur de classe est éligible à la gcing et qu'il n'y a pas d'autres références.

Une classe ou une interface peut être déchargée si et seulement si son chargeur de classe définissant peut être récupéré par le collecteur de déchets.

http://java.sun.com/docs/books/jls/third_edition/html/execution.html#12.7

De plus, chaque classe a une référence à son Classloader. Ainsi, un chargeur de classe n'est pas éligible à Gcing tant qu'il y a des références aux classes chargées par l'informatique ou des objets de ces classes à partir d'objets non collectives.

Le finalizer est exécuté un certain temps après qu'un objet soit admissible à la collecte des ordures et avant que le GC réel n'ait lieu.

L'approche des références entrantes gratuites, qui empêchent le gcing, dans un finalisateur ne fonctionne pas. Le finalizer ne sera pas appelé tant que de telles références existent car elles empêchent l'objet de devenir éligible à la collecte des ordures. Par exemple, vous ne pouvez pas briser cette chaîne de référence de l'intérieur:

singleton instance <--- singleton class <--- class loader <--
<-- any class loaded by that class loader  <-- any object of such a class
<-- object loaded by another classloader referencing such an object or class

Autres conseils

Le comportement des finaleurs n'a pas modifié le chargeur de classe ni l'utilisation de la génération permanente, bien qu'il aggrave le problème des performances. Les objets ne peuvent être collectés qu'après l'exécution du finaliste. Ainsi (simplifiant en supposant le non-concurrent et en ignorant faible / doux / fantôme), il y a un exécution du GC qui détermine qu'il n'y a pas de références actives au graphique d'objet, y compris le chargeur de classe. Les finaleurs sont ajoutés à la file d'attente de finalis pour puis exécutés. Ensuite, après quelques passes ultérieures du GC, la mémoire peut être récupérée. Cela nécessite un GC complet, y compris sur l'espace de génération de perm, qui est généralement rare et peut être désactivé.

Quoi qu'il en soit, n'utilisez pas de singletons (avec état).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top