質問
JSFがセッションを満杯にしている問題が発生します。先日、システムがクラッシュしました。レビューのためにヒープをIBMに送信すると、50Mものセッションがいくつかあることがわかりました。彼らはセッション中にJSFコンポーネントを見つけました。
では、実行できるチューニングはありますか?見るべき構成アイテム?または他の方向。
私たちのシステムはプレゼンテーション層にJSFとSpringを使用して構築され、バックエンドはEJB、Spring、Hibernateであり、すべてWebSphere 6.1で実行されています。
解決
JSFは便利な技術ですが、あなたは確かにそれを使うことができます。
ビューステートのサイズを大きくしている(コンポーネントに大きな値を設定する)か、コンポーネントへの参照を他のセッションステートにリークしているようです(これは悪いことです)。別の潜在的な犯人は、ビューが非常に大きいことです(UIツリーを構築すると、どこにでもデータテーブルを持つ非常に大きなコントロールグラフが簡単に作成できることがわかりました)。 IBMはリッチテキストとスプレッドシートのコントロールを提供していることを知っています-これらの使用が状態サイズにどのような影響を与えるかについてコメントすることはできません。
控えめな方法は、 faces-config.xml でセッションスコープ用に設定された管理対象Beanを確認することです。
JSFはリクエスト間で2つのことを保存します:
- ビュー(ページ上のすべてのコントロール)
- ビューステート(コントロールの状態)
これらは、データテーブルの子などの一部のコントロールが複数の状態(行ごとに1つ)を持つことができるため、分離されています。状態は、フォームの非表示フィールド(暗号化されていない場合、大きなセキュリティ上の危険性がある)またはセッションのいずれかに保存できます。同じセッションを共有する複数のブラウザーウィンドウ(および、一部の実装では、戻るボタンのサポート)に対応するために、複数のビューが保存されます。
- 特定の時点でアプリが特定のユーザーのセッションに保持するビューステートの数を設定する設定オプションが必要です。
- StateManager は、保存されたビュー/ステートのサイズを測定します(StateManagerを取るパブリックコンストラクターでfaces-config.xmlでStateManagerを構成します- JSF仕様 PDFで詳細を確認できます。状態はシリアル化可能で、ストリームにダンプすることでサイズを確認できます) 。
ほとんどのIDEビルドJSFアプリにはバッキングBeanがあります。セッションBeanスコープを介して、必要以上に長く状態を保持し、セッションに負担をかけることが可能です。ページごとに1つのバッキングBeanが存在する傾向があるため、ページが多いほど、問題は大きくなります。 faces-config.xml を確認して、これが潜在的な問題の原因であるかどうかを確認してください。
他にできることは、 web.xml の"> HttpSessionAttributeListener 。 スタックトレースアプリの問題領域を特定しやすくします。
他のヒント
これは、JSFと過剰なオブジェクト作成のために停止したと聞いた2番目のシステムです。もう1つは、バックエンドでSpringとHibernateを使用しました。 OptimizeItを使用したプロファイリングでは、すべてのリクエストでバックエンドの応答がミリ秒のオーダーであることが示されましたが、30秒から数分かかるため、ストップウォッチを使用してブラウザーのレンダリングを再調整できます。クライアントが消費するメモリはとんでもないものでした。
私はオブザーバーであり、そのプロジェクトチームのメンバーではありませんでした。問題がこれまでに修正されたかどうか、もしそうなら、解決策はどうだったかを尋ねる必要があります。
しかし、2つのポイントがトレンドを作る場合、JSFには致命的な欠陥があると思います。個人的に、私はそれから完全に離れています。
Spring Webフロントエンドを試して、それが役立つかどうかを確認してみませんか? Springのイディオムに従えば、JSFをJSTLベースのJSPおよびSpringコントローラーに置き換えるのは比較的簡単なことです。
JSFプロジェクトに取り組んでいて、複数のJSF h:form要素を追加するバグがあることがわかりました。その結果、すべてのフォームにビューステート全体のコピーが含まれます。ページごとに1つのフォームに削減すると、ページが約200万から約300Kに削減されました。
セッションスコープとして多数のバッキングBeanの問題が発生している可能性があります。
MyFaces Orchestra をご覧ください。これは会話スコープを提供するライブラリであるため、ユーザーが特定のBeanセットを終了すると、セッションから削除されます。
Spring WebFlowには類似の機能があることは理解していますが、実際には検討していません!
JSFは、ビューをセッションに保存して、リッチコンポーネントベースのアーキテクチャをサポートします (そのビューステートを維持する必要があります)、適切に使用されない場合、ヒープを一杯にすることがあります大きなワークフローがない場合は、常にセッションごとのビュー数を少なくしてください。また、可能な限りbackingbeanをセッションに保持しないでください。カスタムタグを使用して、次のリクエストサイクルのためだけにデータオブジェクトを作成します。また、Spring Web FlowとJSFを使用することもできます。これにより、アプリケーションに長いワークフローがある場合にビュースコープとフロースコープが導入され、セッションで設定されるビューの数が減ります。 JSFは、リッチなユーザーインターフェイスを簡単に作成するために使用でき、デスクトップアプリケーションと同様のWebアプリケーションを構築するのに役立ちます。特定のヒープをJSFフレームワークに割り当てて、その作業を行います。ただし、アプリケーション側でメモリを効率的に使用し、メモリリークがないことを確認してください。すべてのメモリリークは、開発中に調査および修正する必要があります。常にプロファイラーを使用して、アプリケーションに存在するメモリリークとパフォーマンスのボトルネックを見つけます。
マット
MyFacesを使用している場合<!> lt; 1.1.6セッション内の古いシリアル化されたビューをキャッシュする方法に巨大なメモリリークがあり、ガベージコレクションできるようにそれらを解放することは事実上できません。それに深刻な問題があり、50Mbセッションもありました。 MyFacesのクイックアップグレードにより、問題なく問題が修正されました。
データベースへのセッション持続性を構成します。これにより、最小使用アルゴリズムを使用して最小使用セッションをメモリからプッシュします。 (適切に構成されていれば)高いパフォーマンスを発揮し、具体的かつ高速に役立ちます。
少し古いトピックですが、最近これに遭遇しました。多くの場合、ビューとビューステートは(前述のように)保存され、セッションをいっぱいにして[戻る]ボタンが機能するようにします。設定する必要があるデプロイメント記述子(web.xml)でこれをソートするパラメーターがあります。
特定のライブラリの複数のインスタンスには、MyFacesやJSF RIを使用する場合など、複数のパラメーター設定が必要になる場合があります。 デフォルトでは、かなり高い値(それぞれ20と16)に設定できます。これは、セッション(の一部?)に必要なスペースの20倍を使用できることを意味します。
実稼働環境向けのJSFチューニングのヒント:
-画像、CSS、およびJavaScriptリソースの使用は、サーバー側ではなく標準のHTMLタグ(img,link,script)
で行う必要があります。相対パスの問題を回避するには、URLの前に#{request.contextPath}
を設定してください。
-(menu,header,footer)
を使用してページomnifaces cache
の静的セクションをキャッシュします
-refresh-period
変数を-1
に設定します
-project-stage
をProduction
に設定します
-コードフィルターがある場合は確認します
また、私の記事を確認してください<!> quot; Java Server現実のアプリケーションの顔 <!> quot; DZoneでは、開発環境、テスト環境、および実稼働環境でのJSFの全体像を把握できます。