2012-03-27 16 views
2

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豆。

答えて

0

これはバグではなく、機能です。そして重要なもの。 Java EEでは、コンテナはさまざまなもの(ステートレスBean、メッセージ駆動Bean、エンティティおよびSFFBなど)のインスタンスを作成し、それらをプールしてチャッシュします。 Java EEを使用する理由の1つは、コンテナに処理させて処理させることです。ほとんどのコンテナでこの動作を設定できます。 Glassfishのドキュメントから

:また

、GlassFishのサーバーは、「ステートフル」インスタンス (ステートフルセッションBeanとエンティティBean)の数を制御することができます調整可能な パラメータの数をサポートだけでなく、キャッシュされました の時間がキャッシュされます。

[..]

GlassFishサーバーのプールで最も重要なパラメータの1つは、 steady-pool-sizeです。 steady-pool-sizeが より大きい値に設定されている場合、コンテナは指定された数のBeanを のBeanプールにあらかじめ投入するだけでなく、この のBeanが常にフリープール。これにより、 のユーザー要求を処理するのに十分な数のBeanが準備完了状態になることが保証されます。

http://docs.oracle.com/cd/E18930_01/html/821-2418/beahn.html#beahq

この動作を望まない場合、あなたはそれを離れて設定することができます:上記のリンクから適切なリンクを読み、従ってください。

+0

私はこれが正しいとは思わない。 (ステートフルBeanの場合)有界キャッシュはプールとは異なります(ステートレスBeanの場合)。ステートフルBeanは再利用できません。私が見ている動作は、ページを読み込むたびに2つのSFSBが作成されていることです。ページを100回ロードすると、200個のBeanが作成されています。 100の "余分な"豆は決して再び使用されません。彼らはプールに追加されたようではありません。これは明らかに望ましくない動作です。 –

+0

同じ方法で、あるいはステートレスと同じ理由でプールされていないのも事実です。ただし、この場合、2回目以降の同時使用でもオブジェクトの初期化(javaでは「高価」)が可能です。 100リクエスト後に200が作成されたのは本当ですが、実際に問題があります(glassfishのデフォルト設定)。申し訳ありませんが、私はそれが事実であるかどうか疑います。 – esej

+0

Re:「疑問」ログを含む上記の私の編集を参照してください –

関連する問題