Le déchargement des classes en java?
J'ai un class loader personnalisé ainsi que d'une application de bureau peut dynamiquement commencer le chargement des classes à partir d'un serveur d'applications j'ai besoin de parler. Nous l'avons fait, puisque le montant des pots qui sont nécessaires pour ce faire sont ridicules (si nous voulions navire de mer). Nous avons aussi des problèmes de la version si on ne charge pas les classes dynamiquement lors de l'exécution de la AppServer bibliothèque.
Maintenant, j'ai juste frappé un problème où j'ai besoin de parler à deux AppServers et a constaté que selon les classes, je charge d'abord je pourrais casser mal... Est-il un moyen de forcer le déchargement de la classe sans tuer la JVM?
Espérons que cela a du sens
OriginalL'auteur el_eduardo | 2008-09-29
Vous devez vous connecter pour publier un commentaire.
La seule manière qu'une Classe peut être déchargé est si le chargeur de classe utilisé est le garbage collector. Cela signifie, les références à chaque classe, et pour le chargeur de classe elle-même besoin d'aller dans le sens de la dodo.
Une possible solution à votre problème est d'avoir un chargeur de classe pour chaque fichier jar, et un chargeur de classe pour chacune des AppServers que les délégués du chargement réel de classes spécifiques Pot de chargeurs de classes. De cette façon, vous pouvez pointer vers différentes versions du fichier jar pour chaque serveur d'Application.
Ce n'est pas anodin, si. La plate-forme OSGi s'efforce de le faire, que chaque série a un autre chargeur de classe et les dépendances sont résolues par la plate-forme. Peut-être une bonne solution serait de prendre un coup d'oeil.
Si vous ne souhaitez pas utiliser OSGI, une implémentation possible pourrait être d'utiliser une instance de JarClassloader classe pour chaque fichier JAR.
Et en créer un nouveau, MultiClassloader classe qui étend la classe Classloader. Cette classe interne aurait un tableau (ou une Liste) de JarClassloaders, et dans le defineClass() méthode d'itérer sur tous les chargeurs de classes jusqu'à ce qu'une définition peut être trouvé, ou un NoClassDefFoundException est levée. Un couple de méthodes d'accès peut être fourni pour ajouter de nouveaux JarClassloaders à la classe. Il existe plusieurs implémentations possibles sur le net pour un MultiClassLoader, de sorte que vous pourriez même pas besoin d'écrire votre propre.
Si vous instancier un MultiClassloader pour chaque connexion au serveur, en principe, il est possible que chaque serveur utilise une version différente de la même classe.
J'ai utilisé le MultiClassloader idée en un projet, où les classes qui contenait définis par l'utilisateur scripts devait être chargé et déchargé de la mémoire et cela a fonctionné assez bien.
Comme plus facile et alternative légère à OSGi, essayez de JBoss Modules - modulaire classloading avec chargeur de classe par module (un groupe de pots).
OriginalL'auteur Mario Ortegón
Oui il y a des façons de charger des classes et de "décharger" plus tard. L'astuce est de mettre en place votre propre classloader qui réside entre le niveau élevé de la classe loader (le Système de chargeur de classe) et la classe des chargeurs de l'application serveur(s), et à espérer que le serveur d'application de classe chargeurs déléguer la classloading à la partie supérieure des chargeurs.
Une classe est définie par son emballage, son nom, et le chargeur de classes à l'origine chargé. Programme d'un "proxy" chargeur de classe qui est la première qui est chargé lors du démarrage de la JVM. Flux de travail:
java.x
etsun.x
pour le système de chargeur de classes (ces ne doit pas être chargé par le biais de tout autre chargeur de classe que le système de chargeur de classe).Fait, il ne devrait pas venir d'un ClassCastException ou LinkageError etc.
Pour plus d'informations à propos du chargeur de classe hiérarchies (oui, c'est exactement ce que vous êtes en œuvre ici ;- ) regardez "Serveur de Base de Programmation Java" par Ted Neward - ce livre m'a aidé à la mise en œuvre de quelque chose de très similaire à ce que vous voulez.
ClassLoader
par classe est un peu trop, unClassLoader
par BOCAL de sens. Pourrait être plus précis sur la façon de forcer la classe de téléchargement dans la proposition de schéma? E. g. comment puis-je garantir, que les instances de classes chargées par ClassLoaderA ne sont pas visés par les instances chargées par ClassLoaderB?exactement, la réponse est bonne, mais il n'est pas de toucher les points clés que vous avez mentionné.
est-il une implémentation existante, nous pouvons instaniate/réutilisation pour cela?
Il serait très très utile,si vous pouvez fournir l'exemple de code java.Pour être précis,je suis à la recherche de Comment décharger les classes à l'aide de CustomClassLoader mais pas eu de chance.
Avez-vous essayé et mis en œuvre un échantillon?
OriginalL'auteur Georgi
J'ai écrit un classloader personnalisé, à partir de laquelle il est possible de décharger les classes individuelles sans GCing le chargeur de classe. Jar Chargeur De Classe
Malheureusement pas pour le moment. Mais à elle. Peut-être dans les futures versions.
Par ailleurs, j'ai trouvé un peu de solution de contournement. Si vous avez un
JarClassLoader
pour chaque fichier jar que vous avez chargé, vous pouvez appelergetLoadedClasses()
sur elle, puis itérer sur chaque et le décharger.OriginalL'auteur Kamran
Les chargeurs de classe peut être un problème délicat. Vous pourrez notamment rencontrer des problèmes si vous utilisez plusieurs chargeurs de classes et ne disposent pas de leurs interactions clairement et rigoureusement définis. Je pense que pour être réellement en mesure de décharger une classe youlre va aller pour supprimer toutes les références à toutes les classes(et leurs occurrences) que vous essayez de décharger.
La plupart des gens qui ont besoin de faire ce type de chose de OSGi. OSGi est vraiment puissant et étonnamment léger et facile à utiliser,
OriginalL'auteur Steve g
Vous pouvez décharger un chargeur de classe, mais vous ne pouvez pas décharger les classes spécifiques. Plus spécifiquement, vous ne pouvez pas décharger les classes créées dans un chargeur de classe qui n'est pas sous votre contrôle.
Si possible, je vous conseille d'utiliser votre propre chargeur de classe de sorte que vous pouvez décharger.
OriginalL'auteur Jason Cohen
Classes ont implicitement référence forte à leur chargeur de classe de l'instance, et vice versa. Ils sont nettoyés qu'avec des objets Java. Sans heurter les outils de l'interface ou similaire, vous ne pouvez pas supprimer les classes individuelles.
Comme toujours, vous pouvez obtenir des fuites de mémoire. Toute référence forte à l'une de vos classes ou catégorie chargeur de fuite de l'ensemble de la chose. Cela se produit avec le Soleil implémentations de ThreadLocal, java.sql.DriverManager et java.les haricots, par exemple.
OriginalL'auteur Tom Hawtin - tackline
Si vous êtes en direct regarder si le déchargement de la classe a travaillé dans JConsole ou quelque chose, essayez d'ajouter également
java.lang.System.gc()
à la fin de votre classe de déchargement de la logique. Il déclenche explicitement Garbage Collector.OriginalL'auteur Aleksander Drozd