9

JBoss 7.1.1 の JavaEE6 プロジェクト (EJB3、JSF2) では、@ViewScoped Bean でメモリ リークが発生しているようです。最後の 3 日間、私はこの問題の調査に時間を費やしました。したがって、最初のページが @ViewScoped Bean を離れた後に解放されることを保証するために、2 つのページを持つ単純なプロジェクトを作成しました。

<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" />
    ....

シスアウト:

  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)

そして、他の @ViewScoped Bean に依存関係を追加するまで、すべての考えがうまくいきました

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";

}

その後、ビーンは1つもリリースされていません。誰かがそれに対処する方法を知っていますか?これはバグですか、それともどこかで構成されている可能性がありますか?

4

1 に答える 1

6

残念ながら、あなたは正しいです。ここここで@ViewScopedわかるように、メモリ管理には既知の問題があります (ビューの連鎖だけには関係ありません) 。この質問も見てください。実験できるのは、現在のセッションごとにオブジェクトを取得し、いくつかのイベントに基づいて呼び出すことです。これを試すこともできますUIViewRootgetViewMap().remove("myView")

これとは関係ありませんが、なぜビュー スコープの Bean を連鎖させているのですか? これらは、ビュー用に名前を付けて使用することを目的としています。の使用を制限されていSessionScopedますか?

于 2012-10-27T04:19:22.707 に答える