2009-06-29 15 views
10

Tengo curiosidad por saber si hay alguna abstracción de Java que sea similar al Dominio de aplicaciones de .Net.Java AppDomain like abstraction?

En particular, tengo curiosidad porque he descubierto que con nuestro servidor Coldfusion/J2EE necesitamos reiniciarlo cada pocos días debido a una pérdida lenta de memoria que todavía no hemos podido rastrear fácilmente. Esto puede arruinar nuestros procesos de larga ejecución y realmente nos gustaría una forma de empujar lentamente a las personas a nuevas JVM a medida que pasan de un cierto período de tiempo/umbral de memoria.

Desde mi experiencia limitada en .Net, estoy bastante seguro de que esta es una situación que IIS y AppDomains son capaces de gestionar de forma bastante sencilla al reciclar los AppDomains que están bajo presión de memoria. Avíseme si estoy lejos de AppDomains para ayudar en este escenario.

¿Alguna sugerencia?

Respuesta

10

creo que la respuesta aceptada aquí es un poco engañoso. Simplemente decir "no, no puedes" no es toda la historia. La pregunta se centra en descargar clases de Java en un proceso de servidor para eliminar el código de fuga del proceso de JVM sin reiniciar el proceso. El OP no solicita la característica de aislamiento de memoria similar a un proceso que ofrece un AppDomain, sino la capacidad de descargar clases en una JVM en ejecución.Digo un proceso similar, ya que bajo el concepto de AppDomain no es un proceso, pero disfruta de algunos de los aspectos de aislamiento que el sistema operativo ofrece a un proceso de primera clase. El JSR aislado mencionado hace referencia a este aislamiento 'similar a un proceso'. Es posible descargar ClassLoaders de Java y por lo tanto clases, sin ciclar el proceso del SO que aloja la JVM. Aquí se mencionan algunos métodos: SO 148681. No es trivial o elegante hacer esto en Java, pero es posible.

+0

Tienes razón. Gracias por la respuesta. –

0

El reciclaje de JVM individuales en función del tiempo o de criterios específicos, como el aumento del consumo de memoria y la memoria, es una capacidad de las versiones avanzadas del servidor de aplicaciones con el que trabajo, WebSphere. Si su servidor de aplicaciones no tiene esa capacidad, entonces la creación de algunos scripts de shell para dar algo como esa función debería ser factible.

Esto funciona bastante bien asumiendo:

a). Las solicitudes de los usuarios se rocían alrededor de un conjunto más grande de JVM. b). Que todas las solicitudes son apátridas o hay alguna capacidad de replicación de estado. La replicación es una capacidad de WebSphere y WebLogic, supongo que otros servidores de aplicaciones también tienen la capacidad.

En este tipo de entornos que no hay necesidad de "poco a poco" mover a la gente a otros servidores. Solo necesitamos saber que podemos detener con seguridad cualquier servicio/JVM y que estas sesiones se reanudarán en otra instancia.

+0

Gracias por su comentario. Desafortunadamente, mi aplicación web actualmente no es apátrida y la replicación no es posible porque la sesión no es serializable. Tal vez sería mejor que lo hiciera haciendo que todo allí fuera serializable. –

8

Por desgracia, no. El concepto análogo en el mundo de Java es el aislante, que apareció primero en el JSR 121. Esta era una API para una función de JVM futura que permitiría la separación segura y la comunicación entre diferentes aplicaciones que se ejecutan en la misma JVM. Después de la publicación de JSR (alrededor de 2004), un equipo de investigación de Sun trabajó en el proyecto de Barcelona. Este proyecto intentó implementar la API de aislamiento en Sun's HotSpot 1.5 VM. Después de dos años, lanzaron un prototipo para SPARC/Solaris. Las versiones de Windows/Linux nunca fueron lanzadas debido a problemas de estabilidad.

Recientemente, Sun ha introducido una versión limitada de la API de aislamiento para J2ME, centrándose de ofrecer "múltiples procesos" en entornos que no les ofrecieron de forma activa. Recientemente, también le pedimos a Sun su estado para implementar la API Aislar a JVM estándar y su respuesta fue que planean lanzar una JVM con soporte limitado. Planean ofrecer la capacidad de cargar/descargar aislamientos pero sin la capacidad de comunicarse entre ellos.

Además, ha habido un antiguo esfuerzo de investigación para construir una versión JVM compatible con Isolates, llamada JanosVM (Java 1.1) pero dudo que pueda ser de alguna utilidad en la actualidad.

Espero que esto ayude ...

+0

¡Gracias! ¡Eso fue realmente interesante e informativo! –