Trong dự án JavaEE6 của chúng tôi (EJB3, JSF2) trên JBoss 7.1.1, có vẻ như chúng tôi có rò rỉ bộ nhớ với hạt @ViewScoped. Những ngày cuối cùng của cây tôi đã dành thời gian cho việc điều tra vấn đề này. Vì vậy, tôi đã tạo dự án đơn giản với hai trang để đảm bảo rằng sau khi trang đầu tiên rời khỏi @ViewScoped bean sẽ được phát hành.View ViewScoped beans dẫn đến rò rỉ bộ nhớ
<context-param> //web.xml
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>
<context-param>
<param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
<param-value>false</param-value>
</context-param>
TreeBean.java
@ManagedBean
@ViewScoped
public class TreeBean implements Serializable {
private TreeNode root;
public static AtomicInteger count = new AtomicInteger(0);
@Override
protected void finalize() throws Throwable {
System.out.println("TreeBean beans count: " + count.decrementAndGet() + " (FINALISATION)");
}
public TreeBean() {
super();
System.out.println("TreeBean beans count: " + count.incrementAndGet() + " (INITIALISATION)");
}
first.xhtml
....
<h:form id="frm">
<p:tree
value="#{treeBean.root}"
var="node"
id="tree">
....
<p:commandLink
action="second.xhtml?faces-redirect=true"
value="toSecond" />
....
second.xhtml
....
<h:form id="frm">
....
<p:commandLink
action="first.xhtml?faces-redirect=true"
value="toFirst" />
....
sysout:
INFO [stdout] (http--0.0.0.0-8080-4) TreeBean beans count: 1 (INITIALISATION)
INFO [stdout] (http--0.0.0.0-8080-4) TreeBean beans count: 2 (INITIALISATION)
INFO [stdout] (http--0.0.0.0-8080-4) TreeBean beans count: 3 (INITIALISATION)
......
INFO [stdout] (Finalizer) TreeBean beans count: 2 (FINALISATION)
INFO [stdout] (Finalizer) TreeBean beans count: 1 (FINALISATION)
INFO [stdout] (Finalizer) TreeBean beans count: 0 (FINALISATION)
và tất cả nghĩ đến cũng đến khi tôi đã thêm phụ thuộc vào @ViewScoped khác đậu
TreeBean.java
@ManagedBean
@ViewScoped
public class TreeBean implements Serializable {
private TreeNode root;
@ManagedProperty(value = "#{treeNodeBean}")
private TreeNodeBean treeNodeBean;
public static AtomicInteger count = new AtomicInteger(0);
@Override
protected void finalize() throws Throwable {
System.out.println("TreeBean beans count: " + count.decrementAndGet() + " (FINALISATION)");
}
public TreeBean() {
super();
System.out.println("TreeBean beans count: " + count.incrementAndGet() + " (INITIALISATION)");
}
TreeNodeBean.java
@ManagedBean
@ViewScoped
public class TreeNodeBean implements Serializable {
private String treeNodeItem="TreeNodeItem";
}
Và sau đó không ai đậu đã được phát hành. Có ai biết cách đối phó với nó không? Đây có phải là một lỗi hoặc nó có thể được cấu hình ở đâu đó?
Tham khảo liên kết này. Làm việc xung quanh được thực hiện cho JSf 2.1 & 2.2 http://stackoverflow.com/questions/12182844/memory-leak-with-viewscoped-bean –