JSF: Mojarra против OmniFaces @ViewScoped: @PreDestroy, но bean не может быть собранным мусором
Этот вопрос специфичен для OmniFaces @ViewScoped bean (однако интерес к более широкому обсуждению об утечке памяти и утилизации ресурсов с помощью JSF @ViewScoped). Он основан на результатах этого тестового веб-приложения NetBeans8.1, доступного на GitHub:
https://github.com/webelcomau/JSFviewScopedNav
В этом тестовом веб-приложении есть полный README с полными инструкциями, а также аннотированные тестовые веб-страницы, сравнивающие устаревший стиль JSF2.0 @ManagedBean @ViewScoped
, JIF2.2-стиль CDI-friendly @Named @ViewScoped
и OmniFaces @Named @ViewScoped
beans.
Результаты, полученные с помощью JVisualVM для диагностики, суммируются в загружаемой электронной таблице (см. также снимок экрана ниже) и указывают, что, хотя OmniFaces-2.5.1 @ViewScoped
bean вызывает методы @PreDestroy в случаях навигации на основе GET при выходе представление (дающее возможность освободить большинство ресурсов), похоже, не позволяет сборку мусора фактического bean (по крайней мере, не с настройками текущего контекстного параметра).
В web.xml приложение настроено на использование:
com.sun.faces.numberOfViewsInSession 4
com.sun.faces.numberOfLogicalViews 4
По умолчанию этот параметр, специфичный для OmniFaces, закомментирован:
org.omnifaces.VIEW_SCOPE_MANAGER_MAX_ACTIVE_VIEW_SCOPES
По умолчанию для javax.faces.STATE_SAVING_METHOD используется "сервер".
Основной вопрос:
Q1: Правильно ли, что эти OmniFaces @ViewScoped
beans не могут быть спроектированы как сборщик мусора, собранный "вживую" (что означает, например, провокацию с использованием действия сборки мусора Profiler, не дожидаясь окончания сеанса)?
Q2: Если это так, как может (должен) высвободить один из них при переходе от страниц (особенно в навигационных системах GET)?
Q3: Если это не так (если мои результаты неверны из-за каких-то других настроек), почему я не вижу, что вызвал их сбор мусора, и что я могу сделать, чтобы они действительно были автоматически выпущены?
Поскольку тестовое веб-приложение доступно для загрузки, хорошо документировано и, надеюсь, само собой разумеется, я не буду здесь давать код, а просто сравнительные результаты до сих пор, а также скриншоты страниц тестового веб-приложения в действии: