EDIT: проблема, поднятая этим вопросом, очень хорошо объяснена и подтверждена в этой статье codebulb.ch, включая некоторое сравнение между JSF @ViewScoped
, CDI @ViewSCoped
и Omnifaces @ViewScoped
, а также четкое заявление о том, что JSF @ViewScoped
является «дырявым по дизайну» : 24 мая 2015 г. Java Сравнение областей действия компонентов EE 7, часть 2 из 2
РЕДАКТИРОВАТЬ: 2017-12-05 Тестовый пример, использованный для этого вопроса, по-прежнему чрезвычайно полезен, однако выводы, касающиеся сборки мусора в исходном сообщении (и изображениях), были основаны на JVisualVM, и с тех пор я обнаружил, что они недействительны. . Вместо этого используйте профилировщик NetBeans! Теперь я получаю полностью согласованные результаты для OmniFaces ViewScoped с тестовым приложением при принудительном сборе мусора из профилировщика NetBeans вместо JVisualVM, подключенного к GlassFish/Payara, где я все еще получаю ссылки удерживается (даже после вызова @PreDestroy) полем sessionListeners
типа com.sun.web.server.WebContainerListener
в пределах ContainerBase$ContainerBackgroundProcessor
, и они не будут выполнять сборку мусора.
Известно, что в JSF2.2 для страницы, которая использует bean-компонент @ViewScoped, переход от него (или его повторная загрузка) с использованием любого из следующих методов приведет к тому, что экземпляры bean-компонента @ViewScoped «подвиснут» в сеансе, поэтому что он не будет собирать мусор, что приведет к бесконечному увеличению памяти кучи (пока спровоцировано GET):
Использование ссылки h: для ПОЛУЧЕНИЯ новой страницы.
Использование h:outputLink (или HTML-тега A) для ПОЛУЧЕНИЯ новой страницы.
Перезагрузка страницы в браузере с помощью команды или кнопки RELOAD.
Перезагрузка страницы с помощью клавиши ENTER на URL-адресе браузера (также GET).
Напротив, прохождение через навигационную систему JSF с использованием, скажем, h:commandButton приводит к выпуску bean-компонента @ViewScoped, который может быть удален сборщиком мусора.
Это объясняется (от BalusC) в JSF 2.1. Метод ViewScopedBean @PreDestroy не вызывается и продемонстрирован для JSF2.2 и Mojarra 2.2.9 в моем небольшом примере проекта NetBeans по адресу https://stackoverflow.com/a/30410401/679457, этот проект иллюстрирует различные случаи навигации и является доступно для скачивания здесь. (EDIT: 2015-05-28: полный код теперь также доступен здесь ниже.)
[EDIT: 2016-11-13 Теперь также есть улучшенное тестовое веб-приложение с полными инструкциями и сравнением с OmniFaces @ViewScoped
и таблицей результатов на GitHub: https://github.com/webelcomau/JSFviewScopedNav]
Я повторяю здесь изображение index.html, в котором обобщаются варианты навигации и результаты для кучи памяти:
В: Как я могу обнаружить такие "висячие/висячие" bean-компоненты @ViewScoped, вызванные навигацией GET, и удалить их или иным образом сделать их сборщиком мусора?
Обратите внимание, что я не спрашиваю, как их очистить по окончании сеанса, я уже видел различные решения для этого, я ищу способы очистить их во время сеанса, чтобы куча памяти не росла чрезмерно во время сеанса из-за непреднамеренной навигации GET.
window.onbeforeunload
. Я имею в виду это для OmniFaces 2.2@ViewScoped
. - person BalusC   schedule 23.05.2015@ViewScoped
с OmniFaces 2.5.1 здесь github.com/webelcomau/JSFviewScopedNav и связанный вопрос, связанный с OmniFaces, с таблицами результатов: -be-gar">JSF: Mojarra против OmniFaces @ViewScoped: @PreDestroy вызывается, но bean-компонент не может быть удален сборщиком мусора - person Webel IT Australia - upvoter   schedule 13.11.2016