2009-06-29 5 views
10

Je suis curieux de savoir s'il y a des abstractions Java qui sont similaires à AppDomain de .Net. En particulier, je suis curieux parce que j'ai découvert qu'avec notre serveur Coldfusion/J2EE, nous devons le redémarrer tous les quelques jours en raison d'une fuite de mémoire lente que nous n'avons pas encore pu retrouver facilement. Cela peut détruire nos processus de longue durée et nous aimerions vraiment que l'on pousse lentement les gens vers de nouvelles JVM à mesure qu'ils vieillissent après un certain laps de temps/seuil de mémoire. D'après mon expérience .NET limitée, je suis à peu près certain que c'est une situation que IIS et AppDomains peuvent gérer de manière relativement transparente en recyclant des domaines d'application soumis à la pression de la mémoire. S'il vous plaît laissez-moi savoir si je suis loin sur AppDomains aider dans ce scénario.Java AppDomaine comme l'abstraction?

Des suggestions?

Répondre

10

Je pense que la réponse acceptée est un peu trompeur ici. Dire simplement "non, tu ne peux pas" n'est pas toute l'histoire. La question est centrée sur le déchargement des classes Java dans un processus serveur pour supprimer le code qui fuit du processus JVM sans redémarrage du processus. L'OP ne demande pas la fonction d'isolation de mémoire semblable à un processus qu'un AppDomain donne, mais la possibilité de décharger des classes dans une JVM en cours d'exécution.Je dis processus, car sous le capot un AppDomain n'est pas un processus, mais bénéficie de certains des aspects d'isolement qu'un processus de première classe est offert par le système d'exploitation. L'isolat JSR mentionné fait référence à cet isolement «semblable à un processus». Le déchargement des ClassLoaders java et donc des classes, sans cyclage du processus OS hébergeant la JVM est possible. Quelques méthodes sont mentionnées ici: SO 148681. Ce n'est pas trivial, ou élégant de le faire en Java, mais c'est possible.

+0

Exactement. Merci pour la réponse. –

0

Le recyclage de JVM individuelles en fonction du temps ou de critères spécifiques tels que la consommation croissante de mémoire et l'utilisation de la mémoire est une fonctionnalité des versions avancées de l'App Server avec lequel je travaille, WebSphere. Si votre App Server n'a pas cette capacité, l'élaboration de certains scripts shell pour donner quelque chose comme cette fonction devrait être faisable.

Cela fonctionne très bien en supposant:

a). Les demandes des utilisateurs sont pulvérisées autour d'un plus grand nombre de JVM. b). Que toutes les demandes sont sans état ou qu'il existe une capacité de réplication d'état. La réplication est une fonctionnalité de WebSphere et WebLogic, j'imagine que d'autres serveurs d'applications ont aussi cette capacité.

Dans de tels environnements, il n'est pas nécessaire de déplacer "lentement" les utilisateurs vers d'autres serveurs. Nous avons juste besoin de savoir que nous pouvons arrêter en toute sécurité un service/JVM et que ces sessions vont reprendre sur une autre instance.

+0

Merci pour votre commentaire. Malheureusement, mon application Web n'est actuellement pas apatride et la réplication n'est pas possible car la session n'est pas sérialisable. Peut-être que je serais mieux servi en faisant tout ce qui est sérialisable. –

8

Malheureusement, non. Le concept analogue dans le monde Java est l'isolat apparu en premier dans le JSR 121. Il s'agissait d'une API pour une future fonctionnalité JVM qui permettrait une séparation et une communication sûres entre différentes applications s'exécutant dans la même JVM. Après la publication de la JSR (vers 2004), une équipe de recherche de Sun a travaillé sur le projet de Barcelone. Ce projet a tenté d'implémenter l'API d'isolation dans la machine virtuelle HotSpot 1.5 de Sun. Après deux ans, ils ont sorti un prototype pour SPARC/Solaris. Les versions Windows/Linux n'ont jamais été publiées en raison de problèmes de stabilité. Récemment, SUN a introduit une version limitée de l'API Isolation à J2ME, en se concentrant sur l'offre de «processus multiples» dans des environnements qui ne les offraient pas activement. Récemment, nous avons également demandé à Sun de connaître leur statut dans la mise en œuvre de l'API Isolate sur des machines virtuelles Java standard et leur réponse était qu'ils prévoyaient de publier une machine virtuelle Java avec un support limité. Ils prévoient d'offrir la possibilité de charger/décharger des isolats mais sans pouvoir communiquer entre eux.

De plus, il y a eu un ancien effer de reserach pour construire une version JVM compatible avec les Isolates, appelée JanosVM (java 1.1) mais je doute qu'elle puisse être utile aujourd'hui.

Hope this helps ...

+0

Merci! C'était vraiment intéressant et instructif! –

Questions connexes