Проблема использования памяти JSF при использовании сессионных компонентов

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

10.12.2008 13:05:35
2 ОТВЕТА

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

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

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

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

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

2
10.12.2008 14:35:46

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

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

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

2
10.12.2008 15:14:16