使用会话bean时的JSF内存使用问题

时间:2008-12-10 13:05:35

标签: java jsf java-ee

我正在开发一个具有导航树的应用程序,该导航树是会话bean。 每次我调用包含这个bean的页面时,我的内存使用量都会增加。但是,在几小时不活动后,内存仍然没有被释放。有没有想过为什么会发生这种情况或解决方法?

2 个答案:

答案 0 :(得分:2)

您可以在部署描述符中显式设置会话超时,或者以编程方式执行(尽管您可能不希望在JSF应用程序中执行此操作)。

最终,这是对容器的控制 - 服务器管理何时释放资源,而不管逻辑到期设置如何。

您可以使用侦听器帮助诊断正在发生的事情。例如,您可以使用bean类实现HttpSessionBindingListener。在会话中添加或删除时会收到通知。或者,您可以使用HttpSessionAttributeListener观察所有会话事件(JSF可以使用会话来管理视图状态,因此期望您自己未定义的某些条目)。 HttpSessionAttributeListener在web.xml中定义:

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

如果您只是让服务器处于非活动状态,可能只是它依赖其他会话请求来触发过期的会话清理,并且您正在观察实现细节。或者您可能正在泄漏内存,因为您在某些非托管类中设置了对象的引用。

答案 1 :(得分:2)

您确实需要使用分析器来了解Java应用程序中的内存情况。日食分析器非常好。

如果是会话bean,则不应该为同一会话中页面上的每次点击实例化它。

您还必须记住,GC不会立即收集课程。 GC不一定取决于时间。