【发布时间】:2008-12-10 13:05:35
【问题描述】:
我正在开发一个具有导航树的应用程序,该导航树是会话 bean。 每次我调用包含此 bean 的页面时,我的内存使用量都会增加。然而,经过几个小时的不活动,内存仍然没有被释放。是否有任何想法为什么会发生这种情况或解决方法?
【问题讨论】:
标签: java jsf jakarta-ee
我正在开发一个具有导航树的应用程序,该导航树是会话 bean。 每次我调用包含此 bean 的页面时,我的内存使用量都会增加。然而,经过几个小时的不活动,内存仍然没有被释放。是否有任何想法为什么会发生这种情况或解决方法?
【问题讨论】:
标签: java jsf jakarta-ee
您可以在部署描述符中显式设置会话超时,或者以编程方式进行(尽管您可能不想在 JSF 应用程序中这样做)。
最终,这是由容器控制的——服务器管理何时释放资源,而不管逻辑到期设置如何。
您可以使用侦听器帮助诊断正在发生的事情。例如,您可以让您的 bean 类实现 HttpSessionBindingListener。在会话中添加或删除它时会收到通知。或者,您可以使用HttpSessionAttributeListener 观看所有会话事件(JSF 可以使用会话来管理视图状态,因此请期待一些您没有自己定义的条目)。 HttpSessionAttributeListener 在 web.xml 中定义:
<listener>
<display-name>MyListener</display-name>
<listener-class>
somepackage.MySessionDiagnosticListenerImpl
</listener-class>
</listener>
如果您只是让服务器处于非活动状态,则可能只是它依赖其他会话请求来触发过期会话清理,并且您正在观察实现细节。或者你可能因为在某个非托管类中设置了对对象的引用而导致内存泄漏。
【讨论】:
您确实需要使用分析器来了解 Java 应用程序中的内存情况。 eclipse profiler 很不错。
如果它是一个会话 bean,则不应在同一会话内为页面上的每次点击实例化它。
您还必须记住,GC 不会立即收集类。而且GC不一定依赖时间。
【讨论】: