Проблема использования памяти JSF при использовании сессионных компонентов - PullRequest
1 голос
/ 10 декабря 2008

Я работаю над приложением, которое имеет дерево навигации, которое является сессионным компонентом. Каждый раз, когда я вызываю страницу, содержащую этот компонент, использование моей памяти будет увеличиваться. Однако после нескольких часов бездействия память все еще не освобождается. Есть ли идеи, почему это происходит, или обходные пути?

Ответы [ 2 ]

2 голосов
/ 10 декабря 2008

Вам действительно нужно использовать профилировщик, чтобы знать, что происходит с памятью в Java-приложении. Профилировщик затмений довольно хорош.

Если это сессионный компонент, его не следует создавать для каждого попадания на страницу в том же сеансе.

Вы также должны помнить, что GC не будет собирать классы сразу. И GC не обязательно зависит от времени.

2 голосов
/ 10 декабря 2008

Вы можете явно установить тайм-аут сеанса в дескрипторе развертывания или сделать это программно (хотя вы, вероятно, не хотите делать это в приложении JSF).

В конечном счете, это контролирует контейнер - сервер управляет моментом освобождения ресурсов независимо от настроек логического истечения срока действия.

Вы можете помочь диагностировать происходящее с помощью слушателей. Например, ваш класс bean-компонента может реализовывать HttpSessionBindingListener . Он будет уведомлен, когда он будет добавлен или удален из сеанса. В качестве альтернативы вы можете просматривать все события сеанса, используя HttpSessionAttributeListener (JSF может использовать сеанс для управления состоянием просмотра, поэтому ожидайте, что некоторые записи вы не определили сами). HttpSessionAttributeListener определен в файле web.xml:

<listener>
    <display-name>MyListener</display-name>
    <listener-class>
        somepackage.MySessionDiagnosticListenerImpl
    </listener-class>
</listener>

Если вы просто оставляете сервер неактивным, возможно, он использует другие запросы сеанса для запуска очистки сеанса с истекшим сроком действия, и вы наблюдаете детали реализации. Или у вас может быть утечка памяти, потому что вы установили ссылку на объект в каком-то неуправляемом классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...