2013-03-07 25 views
13

由Servlet容器自身管理,因为它们是基本上为HttpRequestHttpSession属性分别存储在@RequestScoped@SessionScopedBean管理豆的生命周期。 JSF如何管理@ViewScopedBean的生命周期?我知道它是在创建视图时创建的,并且可以使用,直到有回发到不同的视图。但是我发现,在我们从这个观点出发后,并不是立即收集垃圾。如何以及何时在JSF中销毁@ViewScoped bean?

+0

一旦托管bean操作方法返回有效的导航案例结果,即使它是相同的视图,视图作用域托管bean也将被重新创建并重新创建。阅读这个http://balusc.blogspot.co.il/2011/09/communication-in-jsf-20.html,这是他们存储的地方:http://stackoverflow.com/a/9177769/617373 – Daniel 2013-03-07 07:33:00

+0

那么,在现实中,你不应该能够预测gc或让它立即发生吗?但是关于mojarra中的viewscoped beans,请参阅http://stackoverflow.com/a/13097208/1530938 – kolossus 2013-03-07 12:15:28

+0

垃圾回收是异步的。当视图范围被“销毁”时,它就像所有其他Java对象一样,只是“标记为准备垃圾收集”。注意:标记实际上是0的参考计数(即标记为“不再使用”)。 – DwB 2013-03-13 16:54:34

回答

23

当已经执行

  • 具有非null结果回发它就会被破坏,

  • ,或者在会话(逻辑)视图的数目已经超过与该特定视图是LRU链中的第一个(在Mojarra中,可由com.sun.faces.numberOfViewsInSessioncom.sun.faces.numberOfLogicalViews上下文参数配置,每个默认值为15),

  • 或nu在会话中有很多actieve视图范围已经超出(在Mojarra,这是一个硬编码限制25),另请参见JSF 2.2 Memory Consumption: Why does Mojarra keep the ViewScoped Beans of the last 25 Views in Memory?

  • 或者,会话已过期。

它将因此被当页面被卸载,只需点击某个链接GET到另一个页面,或刷新页面,或者关闭浏览器标签/窗口的结果破坏。豆子会一直存在,直到满足一种高度的条件。无论如何要在卸载时销毁它,请考虑使用OmniFaces @ViewScoped

+0

你是什么意思的LRU?最近最少使用?还有你的意思是什么?逻辑*视图? – Geek 2013-03-13 17:15:48

+2

1)是的。它们存储在一个LRU地图中,按照上次使用的顺序排列。最近最少使用的是第一个条目。 2)请参阅http://stackoverflow.com/questions/12562469/how-can-i-set-the-view-timeout/12564632#12564632 – BalusC 2013-03-13 17:18:01

+0

@BalusC,有没有任何解决方案去糟糕的豆离子更快?将底层viewscoped注释帮助吗? – 2014-09-27 10:04:22