Glassfish 3.1.1のViewScoped JSFバッキングBeanに1つのSFSBを注入しようとしています。唯一の第二は、注入されますが、Glassfishで余分なSFSBが作成されているため、メモリがリークしています
私のログは、TWOにSFSBを作成していることである、これを示しています。その後
INFO: constructed a new sfsb: [email protected]
INFO: constructed a new sfsb: [email protected]e
INFO: constructed a new view scoped bean: [email protected]
、私は離れて移動し、ViewScoped Beanがスコープ外になったとき、私は(削除呼び出します
INFO: destroying view scoped bean: [email protected]
INFO: removing sfsb: [email protected]e
INFO: destroying sfsb: [email protected]e
しかし、@のf48cde0で終わる余分最初の1が注入やったことがなかったので、私はそれにハンドルを持っていない、それは決して削除されます。)SFSBに、と私は、ログで確認します。後で、サーバーをシャットダウンすると、削除されることがわかります。ここで
は私のコードは次のとおりです。
バッキングBean:
package com.example.test.ui;
import java.io.Serializable;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.AjaxBehaviorEvent;
import com.example.test.service.api.TestSFSB;
@ManagedBean(name = "testViewScopedSFSB")
@ViewScoped
public class TestViewScopedSFSB implements Serializable {
private static final long serialVersionUID = 1L;
private static final Logger LOGGER = Logger.getLogger(TestViewScopedSFSB.class.getCanonicalName());
@EJB
private TestSFSB testSFSB;
@PostConstruct
public void postConstruct() {
LOGGER.info("constructed a new view scoped bean: " + this);
}
public int getNumClicks() {
return testSFSB.getNumClicks();
}
public void clicked(AjaxBehaviorEvent event) {
testSFSB.clicked();
}
@PreDestroy
public void preDestroy() {
LOGGER.info("destroying view scoped bean: " + this);
testSFSB.remove();
}
}
SFSBインタフェース:
package com.example.test.service.api;
public interface TestSFSB {
void clicked();
int getNumClicks();
void remove();
}
SFSBの実装:
package com.example.test.service.impl;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.Local;
import javax.ejb.Remove;
import javax.ejb.Stateful;
import com.example.test.service.api.TestSFSB;
@Stateful
@Local(TestSFSB.class)
public class TestSFSBImpl implements TestSFSB {
private static final long serialVersionUID = 1L;
private static final Logger LOGGER = Logger.getLogger(TestSFSBImpl.class.getCanonicalName());
int numClicks = 0;
@PostConstruct
public void postConstruct() {
LOGGER.info("constructed a new sfsb: " + this);
}
@Override
public void clicked() {
numClicks++;
}
@Override
public int getNumClicks() {
return numClicks;
}
@Override
@Remove
public void remove() {
LOGGER.info("removing sfsb: " + this);
}
@PreDestroy
public void preDestroy() {
LOGGER.info("destroying sfsb: " + this);
}
}
そして最後に、 jsfページ:
これは簡単な設定です。これは一体何ができるのでしょうか?おそらくGlassfishのバグ?
EDIT: 私はここに、報告しています何の信憑性についての「疑問」を和らげるために、私はページを10回ロードしたときにログです。注意20個のSFSBが作成されていますが、毎回2回、移動したときには1回だけクリーンアップされます。
ついにINFO: constructed a new sfsb: [email protected]9
INFO: constructed a new sfsb: com.example.test.service.impl._TestSFSBImpl[email protected]
INFO: constructed a new view scoped bean: [email protected]
INFO: destroying view scoped bean: [email protected]
INFO: removing sfsb: [email protected]9
INFO: destroying sfsb: [email protected]9
INFO: constructed a new sfsb: [email protected]9
INFO: constructed a new sfsb: [email protected]3
INFO: constructed a new view scoped bean: [email protected]
INFO: destroying view scoped bean: [email protected]
INFO: removing sfsb: [email protected]3
INFO: destroying sfsb: [email protected]3
INFO: constructed a new sfsb: [email protected]7
INFO: constructed a new sfsb: [email protected]7
INFO: constructed a new view scoped bean: [email protected]
INFO: destroying view scoped bean: [email protected]
INFO: removing sfsb: [email protected]7
INFO: destroying sfsb: [email protected]7
INFO: constructed a new sfsb: [email protected]e
INFO: constructed a new sfsb: [email protected]0
INFO: constructed a new view scoped bean: [email protected]
INFO: destroying view scoped bean: [email protected]
INFO: removing sfsb: [email protected]0
INFO: destroying sfsb: [email protected]0
INFO: constructed a new sfsb: [email protected]0
INFO: constructed a new sfsb: [email protected]
INFO: constructed a new view scoped bean: [email protected]
INFO: destroying view scoped bean: [email protected]
INFO: removing sfsb: [email protected]
INFO: destroying sfsb: [email protected]
INFO: constructed a new sfsb: [email protected]b
INFO: constructed a new sfsb: [email protected]a
INFO: constructed a new view scoped bean: [email protected]
INFO: destroying view scoped bean: [email protected]
INFO: removing sfsb: [email protected]a
INFO: destroying sfsb: [email protected]a
INFO: constructed a new sfsb: [email protected]8
INFO: constructed a new sfsb: [email protected]f
INFO: constructed a new view scoped bean: [email protected]
INFO: destroying view scoped bean: [email protected]
INFO: removing sfsb: [email protected]f
INFO: destroying sfsb: [email protected]f
INFO: constructed a new sfsb: [email protected]0
INFO: constructed a new sfsb: [email protected]b
INFO: constructed a new view scoped bean: [email protected]
INFO: destroying view scoped bean: [email protected]
INFO: removing sfsb: com.example.test.service.impl._TestSFSBImpl_S[email protected]
INFO: destroying sfsb: [email protected]b
INFO: constructed a new sfsb: [email protected]5
INFO: constructed a new sfsb: [email protected]3
INFO: constructed a new view scoped bean: [email protected]
INFO: destroying view scoped bean: [email protected]
INFO: removing sfsb: [email protected]3
INFO: destroying sfsb: [email protected]3
INFO: constructed a new sfsb: [email protected]0
INFO: constructed a new sfsb: [email protected]c
INFO: constructed a new view scoped bean: [email protected]
INFO: destroying view scoped bean: [email protected]
INFO: removing sfsb: [email protected]c
INFO: destroying sfsb: [email protected]c
そして、私はアプリをアンロード、最終的に破壊され得る10余分にSFSBの点に注意してください。
INFO: destroying sfsb: [email protected]9
INFO: destroying sfsb: [email protected]9
INFO: destroying sfsb: [email protected]7
INFO: destroying sfsb: [email protected]e
INFO: destroying sfsb: [email protected]0
INFO: destroying sfsb: [email protected]b
INFO: destroying sfsb: [email protected]8
INFO: destroying sfsb: [email protected]0
INFO: destroying sfsb: [email protected]5
INFO: destroying sfsb: [email protected]0
は行動が原因100本のヒットのために保持していることを私の評判に基づいて、それは私の言葉を取ります同じパターンで200豆。
私はこれが正しいとは思わない。 (ステートフルBeanの場合)有界キャッシュはプールとは異なります(ステートレスBeanの場合)。ステートフルBeanは再利用できません。私が見ている動作は、ページを読み込むたびに2つのSFSBが作成されていることです。ページを100回ロードすると、200個のBeanが作成されています。 100の "余分な"豆は決して再び使用されません。彼らはプールに追加されたようではありません。これは明らかに望ましくない動作です。 –
同じ方法で、あるいはステートレスと同じ理由でプールされていないのも事実です。ただし、この場合、2回目以降の同時使用でもオブジェクトの初期化(javaでは「高価」)が可能です。 100リクエスト後に200が作成されたのは本当ですが、実際に問題があります(glassfishのデフォルト設定)。申し訳ありませんが、私はそれが事実であるかどうか疑います。 – esej
Re:「疑問」ログを含む上記の私の編集を参照してください –