这可能来自JSF的@viewScope导致内存泄漏吗?

时间:2014-10-14 20:53:38

标签: java memory jsf-2.2 view-scope

我的网络应用程序正在发生内存泄漏。(我使用visualVM监控了webapp)

每次,我都会继续使用ViewScope注释bean的特定jsf页面,堆增加。使用viewScope,当我离开页面时,应清除所有对象(和内存)。 即使我关闭会话,堆仍然保持在同一级别,然后再次增加,如果我继续这个jsf页...

显然应用程序会崩溃...... 会话是否关闭不好(是否应该“杀死”所有对象)?或者对象引用是否仍然存在并且垃圾收集器不能完成这项工作?

1 个答案:

答案 0 :(得分:0)

查看生命周期管理是特定于JSF实现的。 MyFaces和Mojarra实现了一个队列 - 当它被填满时,然后在下一次创建一个新视图时,将删除一个旧视图。如果我没有弄错的话,最近最少使用的那个。有关其他详细信息,请参阅BalusC's answer

您无法可靠地检测到用户已离开该页面。您可以在使用js导入事件之前听取窗口,但它不会完美地工作。我知道ICEfaces 1.8.2可以做到这一点。

当会话被破坏时,其所有视图也会被销毁。

您的期望存在一些问题。

  • 你是什么意思"关闭会议"?即使您关闭了所有浏览器窗口,您仍然需要等到会话超时。即便如此,它还不确定,网络容器通常不承诺立即删除过期的会话。您可以通过服务器日志监控会话销毁 - 因为您可能需要调整特定服务器的日志设置或创建HttpSessionListener。
  • 垃圾收集不保证会立即删除所有无法访问的对象。通过VisualVM强制完整GC几次 - 通常就足够了。但不是100%。