Destruya limpiamente el contexto de aplicación Spring

Me he encontrado con problemas para asegurarme de que un contexto de aplicación de primavera que estoy destruyendo desapareció por completo, y no puedo ver el objeto que se está recolectando basura. Cuando miro la instancia en VisualVM, puedo ver que hay una serie de referencias sobresalientes tanto al contexto como a su fábrica de frijoles que permanecen una vez que el contexto se cierra y se destruye. Todo esto debe estar relacionado con la configuración inicial de la fábrica de frijoles (durante el método de actualización de AbstractApplicationContext) que registra la fábrica de frijoles y el contexto con varios procesadores posteriores de frijoles, etc.

No parece haber ningún método en la fábrica de frijoles o en los contextos de aplicación (incluso los refrescables) que hagan más que eliminar la referencia de nivel más bajo a la fábrica de frijoles. El resultado es que parece estar perdiendo memoria y, en ciertas circunstancias, impide la recreación limpia de un contexto.

Pregunto porque el software en el que estoy trabajando en este momento puede crear / destruir dinámicamente y luego volver a crear el contexto (ya que los módulos se cargan y descargan dinámicamente) y los elementos sobrantes del contexto y la fábrica de beans están causando problemas con componentes como como spring-data-jpa (especialmente el proxy que une las interfaces del repositorio a las implementaciones del repositorio).

¿Alguien sabe de alguna manera por la que pueda eliminar limpia y completamente un contexto y una fábrica de frijoles sin tener que cerrar por completo la VM que lo creó inicialmente?

Respuesta 1

Después de analizar esto nuevamente recientemente, noté que estaba anulando el doClose()método del contexto para asegurarme de que los beans se destruyeran por completo, pero no estaba llamando al super.doClose()método, lo que significaba que LiveBeansView.unregisterApplicationContext()/ destroyBeans()/ getLifecycleProcessor().onClose()y closeBeanFactory()no se llamaban.

Agregué esto, y (la mayoría) si no todos los contextos ahora se destruyen limpiamente y se recolecta la basura. Asumiré que los contextos pendientes que no se destruyen son más probablemente problemas en nuestro propio código con referencias colgantes.

Respuesta: 2

Si está utilizando el contenedor IoC de Spring en un entorno de aplicación no web; por ejemplo, en un entorno de escritorio de cliente rico; registra un gancho de apagado con la JVM. Hacerlo garantiza un apagado correcto y llama a los métodos de destrucción relevantes en sus beans singleton para que se liberen todos los recursos. Por supuesto, aún debe configurar e implementar estas devoluciones de llamada de destrucción correctamente.

Para registrar un enlace de cierre, debe llamar al registerShutdownHook()método que se declara en la AbstractApplicationContextclase:

Código

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public final class startup {

  public static void main(final String[] args) throws Exception {
      AbstractApplicationContext ctx
          = new ClassPathXmlApplicationContext(new String []{"beans.xml"});

      // add a shutdown hook for the above context... 
      ctx.registerShutdownHook();

      // app runs here...

      // main method exits, hook is called prior to the app shutting down...
  }
}
Respuesta: 3

Al usar la API JAVA SDK de CA Siteminder, notamos un problema extraño que a veces el init falla al azar. También las reinicializaciones ocurren más tarde sin cambios en el sistema. Es un poco alarmante y ...

Entiendo qué es Type Witness como lo veo en Generics Trail In Java Documentation BoxDemo. <Integer> addBox (Integer.valueOf (10), listOfIntegerBoxes); Alternativamente, si omite el tipo ...

Estoy tratando de resolver este problema usando el menor tiempo de ejecución. Si se nos proporciona una matriz 2D, debemos devolver x si existe una fila donde todos los valores son iguales a x, y hay una columna donde todos los valores ...

Esta parece ser una pregunta común con muchas respuestas diferentes. Antes de responder, he usado joda-time y atomdate y funcionan muy bien. Mi interés aquí no es qué biblioteca usar, sino ...