1

考えられる回避策を探すためにすでに3日間を費やしているので、ViewScoped BeanによってOutOfMemoryExceptionが発生することはありませんが、運がありません。

最初の私の環境:Mojarra2.1.7を使用したJBossAS 7.1.1.final

ViewScoped Beanはセッションの有効期限が切れると破棄されると思いましたが、破棄されません(ヒープダンプでチェックされます)。この問題を修正するMojarra2.1.16の次の新機能を見つけましたが、残念ながら現在、このバージョンにアップグレードすることはできません。http: //java.net/jira/browse/JAVASERVERFACES-2561

この問題は、次のスレッドにも関連しています。 セッションの終了時にビュースコープのBeanを破棄する

セッションが終了したとき(ログアウトまたはセッションの有効期限が切れたとき)に、作成されたすべてのViewScoped Beanを削除するためにできることはありますか?viewMapをSessionScopedBeanに保存し、clear()を呼び出しても、それらのBeanは破棄されません。

前もって感謝します、

ダニエル

4

1 に答える 1

0

このバグを突き止めるために、コードを次の部分に取り除きました。

非常に単純な 1 つの JSF2 ページ:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <f:facet name="first">
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
            <title>Simple OOM Check</title>
        </f:facet>
    </h:head>
    <h:body>
        <h:outputText value="#{oomCheckBean.testString}"/>
    </h:body>
</html>

そして、使用された @ViewScoped Bean oomCheckBean:

@ViewScoped
@ManagedBean(name = "oomCheckBean")
public class OomCheckBean implements Serializable {
    private static final long serialVersionUID = 6325712415478215045L;

    private String testString;

    @PostConstruct
    public void init() {
        testString = "Hello World";
        System.out.println("I will survive ....");
    }

    @PreDestroy
    public void destroy() {
        System.out.println("... klaaatsch!");
    }

    /**
     * @return the testString
     */
    public String getTestString() {
        return testString;
    }

    /**
     * @param testString the testString to set
     */
    public void setTestString(String testString) {
        this.testString = testString;
    }
}

この後、JMeter テストケースをログインに変更し、この oomCheck.xhtml ページを呼び出してログアウトしました。しばらくしてテストの実行を停止し、JMX を使用して最初に手動でガベージ コレクターを呼び出しました ( java.lang.Memory --> Operations --> gc() )。この後、メソッドを呼び出してヒープ ダンプを作成します ( com.sun.management.HotSpotDiagnostic --> Operations --> dumpHeap() )。

結果は私の質問で述べたようなものです.メモリにはたくさんの OomCheckBean オブジェクトがあります。所有者オブジェクトはorg/jboss/as/web/deployment/ConcurrentReferenceHashMap$HashEntry. この問題を解決するための助けをいただければ幸いです。上記のように、JSF バージョンが 2.1.16 にアップグレードされた場合、これらの @ViewScoped Bean は破棄され、doctype の欠落や AJAX の問題などの他の「バグ」が残ります。したがって、セッションが無効になったときに @ViewScoped Bean を破棄する方法を誰かが知っていれば幸いです。

于 2012-12-21T11:49:41.137 に答える