2

ご挨拶、

リッチフェイスアプリケーション (3.3.2.SR1) があります。アプリケーションは ModelPanel を使用してエンティティを表示します。すべてのモーダル パネルは、表示するまでレンダリングされません (レンダリング = false)。アプリケーションが大きくなり、1 つのパネルから他のパネルへの関係を多く使用します。すべて正常に動作しますが、コンポーネント rendred が true または false の場合、可能性のあるすべてのケースに対して、richfaces がメモリ内に UIComponent ツリーを作成するように見えます。アプリケーションのメモリ使用量をチェックしようとしたとき (これらのニーズのために YourKit Java Profiler を使用しました)、1 つのセッションで大量のメモリを使用していることがわかります。

私はRichfacesと一緒にFaceletsを使用しており、使用しようとしました

<c:if test="rendred condition"... /> content </c:if>

メモリの使用量が大幅に減り始めますが... パネルで領域を再レンダリングすると、親画面のコントロールが停止します。コンポーネントツリーが変更されるたびにツリー全体が再作成され、クライアント(html)とサーバー(面)の部分が同期されていないことが原因であると思われます。

誰かがメモリ使用量を減らす方法を教えてもらえますか? HeapMemory の StandardSession オブジェクトは 60 ~ 150Mb を使用するため、実際に問題があります。そして、このメモリのほとんどすべてが UIControls に使用されます。

問題の例:

panel1、panel2、panel3 への参照を含むページがあります。

パネルは:

<rich:modalPanel >
    <a4j:outputPanel layout="block" 
             rendered="#{PanelBeanHolder.renderedViewScreen}">
        <ui:insert name="panelContent" />
    </a4j:outputPanel>
</rich:modalPanel>

これに対するアクションが実行された場合にのみ、パネルをレンダリングしています。また、必要になるまで、出力パネルの UI コントロールをロードしたくありません。

前もって感謝します。

PS状況を改善するために次のことを試みました

次を使用して、 web.xml 内のセッションでのビューの数を構成します。

<context-param>
    <param-name>com.sun.faces.numberOfViewsInSession</param-name>
    <param-value>4</param-value>
</context-param>

<context-param>
    <param-name>com.sun.faces.numberOfLogicalViews</param-name>
    <param-value>4</param-value>
</context-param>

StateHolder オブジェクトを改善する必要がありますが、あまり役に立ちません。私は測定を行い、これらの数が増えるとメモリ使用量が増えます。しかし、それらを1,1に設定するのに疲れたとき、いくつかのページが機能しなくなりました。リクエストがようこそページに転送されることがあります。2,2 で状況は改善されましたが、ウェルカム ページへの転送に関する問題は引き続き発生します。

javax.faces.STATE_SAVING_METHOD でクライアント モードを使用しようとしました。UIComponent モデルにはまだ多くのメモリが使用されます。オブジェクトがシリアル化され、フォームに保存する必要がある場合でも。

faces.config で stateManagerを書き直そうとし ました:

<state-manager>org.ajax4jsf.application.CompressAjaxStateManager</state-manager>

ストリームを圧縮するために buildViewState と restoreView を書き直します。あまり役に立ちません。

4

1 に答える 1

3

JSFは、リクエスト間で維持されるステートフルコンポーネントツリーを使用します。デフォルトでは、これは通常、セッションで維持されます。これを制御するために使用できる機能があります。

状態保存パラメーターを構成する

通常、セッションに格納されるビューの数を制御するための実装固有のパラメーターがあります。アプリケーションの動作によっては、これは簡単な方法かもしれません。

パラメータを使用して、状態をフォームに保存できjavax.faces.STATE_SAVING_METHODます。ただし、リクエストごとにより多くの情報を送信することに注意してください。クライアントがサーバー側の状態を指定できるようにすることにはセキュリティ上のリスクがあります(実装がこのデータを暗号化する方法に満足していることを確認してください)。特にAJAXを使用している場合は、コンポーネントライブラリ(つまりRichFaces)との互換性を確認する必要があります。

JSF 2は、セッションのオーバーヘッドを削減する新しい状態保存メカニズムを使用します。faces-config.xml2.0バージョンに更新する必要があります。このアイデアはApacheTrinidadから来たものだと思います。そのため、そこからJSF2より前のバージョンを抽出できる可能性があります。

独自の状態保存および/またはビューの作成を行う

独自の実装StateManagerや、ViewHandlerビューの処理方法をプログラムで制御できるようにします。たとえば、StateManager永続化されたビューをデータベースに書き込むことができます(適切なタイムアウトとクリーンアップを使用)。

コンポーネントバインディングと一時的な制御を使用する

コンポーネントの作成方法をプログラムで制御できます。バインディングの仕様から:

  • コンポーネントインスタンスが最初に作成されると(通常、JSPページでによって参照されるため)、JSF実装は名前バインディングUIComponentELTagのを取得し、それを呼び出します。この呼び出しがnull以外の値を返す場合(JavaBeanがプログラムでインスタンス化され、コンポーネントがすでに構成されているため)、そのインスタンスは作成中のコンポーネントツリーに追加されます。呼び出しがnullを返す場合、新しいコンポーネントインスタンスが作成され、コンポーネントツリーに追加され、で呼び出されます(これにより、JavaBeanのプロパティが新しく作成されたコンポーネントインスタンスに設定されます)。ValueExpressiongetValue()UIComponentsetValue()ValueExpression
  • ValueExpressionリクエスト処理ライフサイクルのRestoreViewフェーズでコンポーネントツリーが再作成されると、「バインディング」という名前に関連付けられているコンポーネントごとにコンポーネントツリーがsetValue()呼び出され、再作成されたコンポーネントインスタンスが渡されます。

おそらく、これを子の一時プロパティとともに使用して、子コンポーネントの作成/破棄をプログラムで制御できます。これは手動で少し面倒ですが、極端な場合には機能する可能性があります。

これは完全なリストではないと確信しています。

于 2011-01-30T16:06:33.160 に答える