Jon*_*ich 7 jsf-2 managed-bean mojarra view-scope jsf-2.2
我在使用Java 7的GlassFish 4上使用Mojarra 2.2.4.
据我所知,从BalusC的回答是如何以及何时在JSF中销毁@ViewScoped bean?,@ViewScoped bean应该在三种情况下销毁:
我的bean在前两种情况下被销毁,但是在超过最大逻辑视图数时却没有.我已经验证了bean 在超过最大值时会过期(我得到一个ViewExpiredException),但是在会话本身到期之前它们仍然没有被销毁.
出于内存消耗的原因,我想在第三种情况下销毁bean,特别是因为它们在到期后无法使用.
这是我的豆子:
@javax.inject.Named("sandboxController")
@javax.faces.view.ViewScoped
public class SandboxController implements Serializable {
private static final Logger log = Logger.getLogger(SandboxController.class.getName());
@PostConstruct
public void postConstruct() {
log.log(Level.INFO, "Constructing SandboxController");
}
@PreDestroy
public void preDestroy() {
log.log(Level.INFO, "Destroying SandboxController");
}
public String getData() {
return "abcdefg";
}
}
Run Code Online (Sandbox Code Playgroud)
和我的sandbox.xhtml:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<body>
<h:form>
<h:outputText value="#{sandboxController.data}"/>
</h:form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
和我的web.xml的一部分:
<context-param>
<param-name>com.sun.faces.numberOfLogicalViews</param-name>
<param-value>3</param-value>
</context-param>
<context-param>
<param-name>com.sun.faces.numberOfViewsInSession</param-name>
<param-value>3</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)
如果我刷新sandbox.xhtml 50次,我会INFO: Constructing SandboxController
在日志中获得50份副本.无论我刷新多少次,都不会销毁bean.VisualVM确认UIViewRoot的ViewMap仍然引用了bean.在我的全尺寸bean中,它保持了相当多的状态,我很快得到一个OutOfMemoryException.
当我手动使会话到期时,我得到了50份INFO: Destroying SandboxController
.
如果我将一个提交按钮添加到sandbox.xhtml并将其加载到4个不同的选项卡中,然后尝试提交第一个,我得到一个ViewExpiredException,如预期的那样,但bean仍然没有被销毁.
如果我改为使用javax.faces.bean.ManagedBean和javax.faces.view.ViewScoped注释,行为是相同的.但是,OmniFaces注释org.omnifaces.cdi.ViewScoped正常工作.
我@ViewScoped豆都被摧毁了会话过期,与相关的问题,如描述问题挂钩ViewScoped豆导致内存泄漏
我不是问为什么每个bean都不会在后续刷新时被立即销毁,如下所示:JSF 2.1 ViewScopedBean @PreDestroy方法未被调用.我想知道为什么即使它们到期并且不再有用,它们仍然没有被破坏,因此继续消耗内存.
我能够通过使用 OmniFaces @ViewScoped 注释 ( org.omnifaces.cdi.ViewScoped
) 而不是标准 @ViewScoped ( javax.faces.view.ViewScoped
) 找到一个干净的解决方法。
一旦 Bean 过期,OmniFaces ViewScoped 就会正确销毁它们。
请参阅此处了解更多详细信息: http://showcase.omnifaces.org/cdi/ViewScoped
归档时间: |
|
查看次数: |
4607 次 |
最近记录: |