Cómo detectar y eliminar (durante una sesión) frijoles @ViewScoped no utilizados que no se pueden recolectar basura

EDITAR: El problema planteado por esta pregunta está muy bien explicado y confirmado en este artículo por codebulb.ch, incluida alguna comparación entre JSF@ViewScopedCDI@ViewSCopedy los omnifaces@ViewScopedy una declaración clara de que JSF@ViewScoped es 'permeable por diseño':24 de mayo de 2015 Ámbitos de Java EE 7 Bean comparados con la parte 2 de 2

EDITAR: 2017-12-05 El caso de prueba utilizado para esta pregunta sigue siendo extremadamente útil, sin embargo, las conclusiones sobre la recolección de basura en la publicación original (e imágenes) se basaron en JVisualVM, y desde entonces he descubierto que no son válidas.¡Use el NetBeans Profiler en su lugar! Ahora estoy obteniendo resultados completamente consistentes para OmniFaces ViewScoped con la aplicación de prueba para forzar GC desde el NetBeans Profiler en lugar de JVisualVM adjunto a GlassFish / Payara, donde obtengo referencias aún retenidas (incluso después de que @PreDestroy llamó) por camposessionListeners de tipocom.sun.web.server.WebContainerListener dentroContainerBase$ContainerBackgroundProcessor, y no van a GC.

Se sabe que en JSF2.2, para una página que usa un bean @ViewScoped, navegar lejos de él (o volver a cargarlo) utilizando cualquiera de las siguientes técnicas dará como resultado instancias del bean "ViewScoped" "colgando" en la sesión. que no se recolectará basura, lo que conducirá a una memoria de almacenamiento dinámico que crece sin cesar (siempre que sea provocada por GET):

Usando un enlace h: para OBTENER una nueva página.

Usando un h: outputLink (o una etiqueta HTML A) para OBTENER una nueva página.

Recargar la página en el navegador usando un comando o botón RELOAD.

Recargar la página usando un teclado ENTER en la URL del navegador (también GET).

Por el contrario, pasar por el sistema de navegación JSF usando say an h: commandButton da como resultado la liberación del bean @ViewScoped de modo que se pueda recolectar basura.

Esto se explica (por BalusC) enNo se llama al método JSF 2.1 ViewScopedBean @PreDestroy y demostrado para JSF2.2 y Mojarra 2.2.9 por mi pequeño proyecto de ejemplo NetBeans enhttps://stackoverflow.com/a/30410401/679457, cuyo proyecto ilustra los diversos casos de navegación y esdisponible para descargar aquí. (EDITAR: 2015-05-28: el código completo ahora también está disponible aquí a continuación).

[EDITAR: 2016-11-13 Ahora también hay una aplicación web de prueba mejorada con instrucciones completas y comparación con OmniFaces@ViewScoped y tabla de resultados en GitHub aquí:https://github.com/webelcomau/JSFviewScopedNav]

Repito aquí una imagen del index.html, que resume los casos de navegación y los resultados para la memoria de montón:

P: ¿Cómo puedo detectar tales beans @ViewScoped "colgantes / colgantes" causados por las navegaciones GET y eliminarlos, o hacer que se puedan recolectar basura?

Tenga en cuenta que no estoy preguntando cómo limpiarlos cuando finaliza la sesión, ya he visto varias soluciones para eso, estoy buscando formas de limpiarlos durante una sesión, para que la memoria del montón no crezca excesivamente durante una sesión debido a navegaciones GET involuntarias.

Respuestas a la pregunta(2)

Su respuesta a la pregunta