Возможно ли, что @viewScope из JSF вызывает утечку памяти?

В моем веб-приложении происходит утечка памяти (я отслеживал веб-приложение с помощью VisualVM).

Каждый раз, когда я захожу на определенную страницу jsf, bean-компонент которой аннотирован с помощью ViewScope, куча увеличивается. С viewScope все объекты (и память) должны очищаться, когда я покидаю страницу. Даже если я закрою сеанс, куча останется на том же уровне, а затем снова увеличится, если я перейду на эту страницу jsf...

Таким образом, очевидно, что приложение рухнет ... Сессия не закрывается хорошо (должна ли она «убивать» все объекты)? или возможно, что ссылки на объекты все еще сохраняются, а сборщик мусора не выполняет свою работу?


person ZheFrench    schedule 14.10.2014    source источник
comment
У вас есть какие-либо данные на этой странице?   -  person Vishnudev K    schedule 29.10.2014
comment
Да, с 3000 строк, отображаемых группой из 50, благодаря меню навигации.   -  person ZheFrench    schedule 29.10.2014
comment
данные разбиты на страницы?   -  person Vishnudev K    schedule 29.10.2014
comment
извините, да, это то, что я пытался сказать   -  person ZheFrench    schedule 29.10.2014
comment
datatable используется для хранения состояний представления в сеансе даже в управляемых компонентах с областью представления. Используйте Jconsole и проверьте, какие классы используют больше памяти   -  person Vishnudev K    schedule 30.10.2014


Ответы (1)


Управление жизненным циклом представлений зависит от реализации JSF. MyFaces и Mojarra реализуют очередь — когда она заполнится, то при следующем создании нового представления какой-то старый будет удален. Наименее недавно использованный, если не ошибаюсь. Дополнительные сведения см. в ответе BalusC.

Вы не можете надежно определить, что пользователь покинул страницу. Вы можете прослушивать события window beforeunload с помощью js, но это не будет работать идеально. Я знаю, что ICEfaces 1.8.2 делает это.

Когда сеанс уничтожается, все его представления также уничтожаются.

Есть некоторые проблемы с вашими ожиданиями.

  • Что вы подразумеваете под "закрыть сессию"? Даже если вы закрыли все окна браузера, вам все равно придется дождаться истечения времени сеанса. И даже тогда это не точно, веб-контейнеры обычно не обещают немедленно удалить просроченные сеансы. Вы можете отслеживать уничтожение сеанса через журнал сервера — для этого вам может потребоваться настроить параметры журнала вашего конкретного сервера или создать HttpSessionListener.
  • Сборщик мусора не обещает, что сразу удалит все недоступные объекты. Принудительно выполните полный сборщик мусора через VisualVM несколько раз — обычно этого достаточно. Но тоже не 100%.
person Vsevolod Golovanov    schedule 15.10.2014