EDIT: проблема, поднятая этим вопросом, очень хорошо объяснена и подтверждена в этой статье с помощью codebulb.ch, включая некоторое сравнение между JSF @ViewScoped
, CDI @ViewScoped
и Omnifaces @ViewScoped
, а также четкое утверждение что JSF @ViewScoped
является "негерметичным по дизайну": 24 мая 2015 г. Java EE 7 Bean области по сравнению с частью 2 из 2
EDIT: 2017-12-05. Тест, используемый для этого вопроса, по-прежнему чрезвычайно полезен, однако выводы, касающиеся коллекции мусора в исходном посте (и изображениях), были основаны на JVisualVM, и с тех пор я обнаружил, что они недействительны, Вместо этого используйте NetBeans Profiler!. Теперь я получаю полностью согласованные результаты для OmniFaces ViewScoped с тестовым приложением для принудительного использования GC из NetBeans Profiler вместо JVisualVM, подключенного к GlassFish/Payara, где я все еще получаю ссылки (даже после того, как @PreDestroy называется) по полю sessionListeners
типа com.sun.web.server.WebContainerListener
внутри ContainerBase$ContainerBackgroundProcessor
, и они не будут GC.
Известно, что в JSF2.2 для страницы, использующей @ViewScoped bean, переход от нее (или перезагрузка) с помощью любого из следующих методов приведет к экземплярам @ViewScoped Bean "болтаться" в сеансе, чтобы не собирать мусор, что привело к бесконечно растущей памяти кучи (до тех пор, пока она вызвана GET):
-
Использование h: link для создания новой страницы.
-
Использование h: outputLink (или тега HTML A) для получения новой страницы.
-
Перезагрузка страницы в браузере с помощью команды или кнопки RELOAD.
-
Перезагрузка страницы с помощью клавиатуры ENTER на URL-адрес браузера (также GET).
В отличие от этого, проходя через навигационную систему JSF, используя команду h: commandButton, выдается выпуск @ViewScoped Bean, так что он может быть собран в мусор.
Это объясняется (по BalusC) в JSF 2.1. Метод ViewScopedBean @PreDestroy не называется и демонстрируется для JSF2.2 и Mojarra 2.2.9 моим небольшим примером NetBeans проект qaru.site/info/9739/..., который иллюстрирует различные варианты навигации и доступен для загрузки здесь. (EDIT: 2015-05-28: полный код теперь также доступен здесь ниже.)
[EDIT: 2016-11-13 В настоящее время также улучшено тестовое веб-приложение с полными инструкциями и сравнением с OmniFaces @ViewScoped
и таблицей результатов в GitHub здесь: https://github.com/webelcomau/JSFviewScopedNav]
Здесь я повторяю изображение index.html, в котором суммируются случаи навигации и результаты для памяти кучи:
В: Как я могу обнаружить "зависание/зависание" @ViewScoped beans, вызванное навигацией GET, и удалить их или иным образом сделать их сборными для мусора?
Обратите внимание, что я не спрашиваю, как очистить их, когда закончится сеанс, я уже видел различные решения для этого, я ищу способы их очистки во время сеанса, так что память кучи не увеличивается чрезмерно во время сеанса из-за непреднамеренных навигаций GET.