tirar tiradero teléfono servicio sacar recolección recoleccion reciclaje ramas que pasa para número donde dompe dias debe cuál cerca basura arboles garbage-collection scope cdi jboss-weld

garbage-collection - tiradero - servicio de recolección de basura



¿La aplicación CDI y los ámbitos dependientes pueden conspirar para impactar la recolección de basura? (2)

Estamos empezando a experimentar con la implementación de nuestros servicios backend usando CDI. El escenario es este:

EJB con @Startup se inicia cuando se implementa EAR. Un frijol ApplicationScoped se inyecta en esto:

@ApplicationScoped public class JobPlatform { private PooledExecutor threadHolder; @Inject @Any private Instance<Worker> workerSource; ...

El bean también tiene un método Observer, que, cuando se observa un evento, obtiene un bean worker del Instance workerSource y lo coloca en el threadPool, donde finalmente se ejecuta.

Todos trabajando muy bien. Sin embargo ... hemos empezado a ver los problemas de recolección de basura. Un histograma de pila JMAP muestra que hay muchos de estos trabajadores dando vueltas, recogiendo basura.

Creemos que esto se debe a la combinación del alcance del CDI. La página de la API para @Dependant ( http://docs.jboss.org/cdi/api/1.0-SP1/javax/enterprise/context/Dependent.html ) refuerza más claramente lo que hay en los documentos:

  • Una instancia de un bean con alcance @Dependent inyectado en un campo, constructor de beans o método de inicialización es un objeto dependiente del bean o instancia de clase de componente Java EE en la que se inyectó.
  • Una instancia de un bean con alcance @Dependent inyectado en un método productor es un objeto dependiente de la instancia de bean del método productor que se está produciendo.
  • Una instancia de un bean con alcance @Dependent obtenida por invocación directa de una instancia es un objeto dependiente de la instancia de instancia.

Entonces, siguiendo esto:

  • El bean workerSource está vinculado a JobPlatform y, por lo tanto, tiene una duración de ApplicationScoped
  • Todos los beans de trabajo recuperados utilizando esa instancia están vinculados a él y, por lo tanto, tienen un tiempo de vida de ApplicationScoped
  • Debido a que el almacén de frijoles del contexto ApplicationScoped (mi conocimiento de la terminología se vuelve un poco confuso aquí) todavía tiene una referencia a beans de trabajo, no se destruyen / se recolectan basura

¿Alguien que usa CDI está de acuerdo con esto? ¿Ha experimentado esta falta de recolección de basura y, de ser así, puede sugerir alguna solución?

Los trabajadores no pueden ser ApplicationScoped, pero la plataforma tiene que serlo. Si tuviéramos que crear un WorkerScope personalizado (uh ohhh ...) y anotar con él cada clase de trabajador, ¿sería eso suficiente para separar la dependencia entre el trabajador y la fuente de la instancia?

También hay algunas sugerencias en ¿Es posible destruir el alcance de un CDI? eso lo veré, pero quería una copia de seguridad sobre si el alcance parece una razón válida.

Espero que puedas ayudar, gracias.



Su comprensión es correcta. Esto fue un descuido en la especificación, y algo que se solucionará en CDI 1.1. Instance puede tener una pérdida de memoria tal como la describió cuando se usó en un ámbito de ejecución prolongada, como SessionScoped o ApplicationScoped . Lo que deberás hacer es conseguir un Contextual o Bean para la instancia y destruirlo de esa manera.

Por lo que está haciendo, y para evitar la pérdida de memoria, es mejor que utilice los métodos de BeanManager para crear instancias (de esa manera también tendrá un control del Bean y podrá destruirlo) en lugar de Instance .