問題があり、これを解決する方法についての情報が必要です。JBoss 7.1 で JSF 2.1 を使用しており、そのビューに関連するテーブルを持つビュー スコープ Bean を使用しています。そのテーブルの行として表されるオブジェクトはかなり大きいです。
これらのビューが更新されるたびに、その Bean の新しいインスタンスが作成されます。
これが起こっていることを確認するために、デモの例を作成しました:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui">
<h:head>
</h:head>
<h:body>
<h:outputText value="#{viewScopedBean.i}" />
</h:body>
</html>
このテンプレートは、次のように定義された Bean にリンクされます。
@ManagedBean
@ViewScoped
public class ViewScopedBean {
private int i = 0;
@PostConstruct
public void init(){
System.out.println("Init - " + i);
}
@PreDestroy
public void dest(){
System.out.println("Destroy - " + i);
}
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
}
ブラウザーの更新ボタンを使用するか、単にブラウザーのアドレス フィールドで Enter キーを押すだけでビューを更新するたびに、@PostConstruct
メソッド呼び出しが明確に表示されます。
アプリを長時間放置する@PreDestroy
と、メソッドが呼び出されていないことがわかります。ヒープダンプを取得するとViewScopedBean
、ビューをリロードした数と同じ数のインスタンスがあり、ヒープに残っているように見えますセッションを破棄した場合。
これは私にとって大きな問題です。なぜなら、500 人のユーザーがその大きなテーブルでビューをリロードすると、JBoss がヒープ スペースがいっぱいになるために停止するからです。
これは Bean の設計された動作@ViewScoped
ですか、それとも何か間違っていますか?