2009-07-15 8 views
1

Je regarde la possibilité de générer du code octet Java au moment de l'exécution (heureusement directement dans la mémoire plutôt que via des fichiers de classe, bien que j'imagine que cela ne fera pas de différence pour mon question). Je comprends que cela peut être fait, la question est, est-ce que le garbage collector balaie le code non-utilisé plus longtemps? Je me souviens il y a quelques années de voir qu'il prétendait que ce n'était pas le cas, mais je ne peux pas trouver de références au sujet.Garbage garbage collection de code généré à l'exécution

Pour clarifier le but de ceci, je ne serais certainement pas déranger pour les scénarios de traitement de données ordinaires. Mais considérons la programmation génétique: potentiellement des milliards de petits programmes générés et exécutés pour des milliards d'exécutions; Dans ce scénario, cela vaut la peine d'essayer de faire fonctionner les choses le plus rapidement possible, et il est important de libérer le code qui n'est plus utilisé. J'essaie de faire quelque chose de plus complexe, mais il y a des similitudes avec la programmation génétique.

+0

Compte tenu de votre exemple (un grand nombre de petites classes), je suggère de regarder une solution qui ne concerne pas les classes Java. La surcharge de création de classloaders pour chacune de ces classes sera extrême. Au lieu de cela, se tourner vers une sorte d'interprète du cru. – kdgregory

+0

Mais ne pouvez-vous pas créer un seul classloader et l'utiliser pour un grand nombre de classes, puis les obtenir toutes en une seule fois lorsque vous supprimez toutes les références au chargeur? – rwallace

+0

Oui - à condition que vous ne vouliez pas en garder et en jeter d'autres (comme le ferait un algorithme génétique). – kdgregory

Répondre

4

Les classes sont liées au ClassLoader qui les a chargées. Pour que la machine virtuelle Java collecte des classes inutilisées, vous devez effacer toutes les références au classloader. C'est ainsi que les serveurs d'applications fonctionnent avec le "déploiement à chaud", et il est probablement instructif de regarder les implémentations de JBoss ou Tomcat si vous n'êtes pas familier avec les chargeurs de classe (je n'ai pas regardé non plus) .

Je me demande, cependant, si cela va vraiment être un problème? Combien de cours prévoyez-vous de créer, quelle sera leur taille et combien de temps vont-ils vivre? Si vous avez beaucoup de grandes classes (disons 50k de bytecode ou plus), et qu'ils vont vivre peu de temps, alors il est logique de les nettoyer. Sinon, pas tellement.

Aussi, pourquoi créez-vous des classes? Est-ce quelque chose que vous pouvez faire avec un langage de script (par exemple Rhino) à partir de la JVM? Ou un interprète construit à la maison? Si oui, cela résoudrait vos problèmes de gestion de classe sans code.

0

Si vous voulez dire que la classe obtient déchargé par le garbage collector, alors non, il ne le fait pas.

Vous pouvez cependant y parvenir en écrivant un chargeur de classe personnalisé.

Questions connexes