1

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

4

2 回答 2

2

您可以在部署描述符中显式设置会话超时,或者以编程方式进行(尽管您可能不想在 JSF 应用程序中这样做)。

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

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

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

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

于 2008-12-10T14:35:46.753 回答
2

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

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

您还必须记住,GC 不会立即收集类。而且GC不一定依赖于时间。

于 2008-12-10T15:14:16.380 回答