OracleADFFacesを使用するプロジェクトに取り組んでいます。ADFは、標準のJSFスコープに加えて、いくつかの追加スコープ(pageFlowScope、viewScope、およびbackingBeanScope)を導入しています。ADFスコープの1つであるviewScopeを使用すると、時間の経過とともにセッションサイズが肥大化するようです。
ビュースコープのオブジェクト(たとえば、バッキングBean)はADFによって管理され、org.apache.myfaces.trinidadinternal.application.StateManagerImpl$PageStateオブジェクトのセッションに配置されているように見えます。セッション内のこれらのオブジェクトの数は、web.xml構成ファイルのorg.apache.myfaces.trinidad.CLIENT_STATE_MAX_TOKENSと同じです。
すべてのトークンが「使い果たされる」と、アプリケーション内を移動することにより、これらのオブジェクトの最も古いものがセッションから削除され、ガベージコレクションが行われます。ただし、このスペースの再利用は、セッションの有効期限が切れた後、ずっと後に観察されます。このため、アプリケーションの負荷テストを行うと、JVMがクラッシュする前に、ヒープスペースの使用量が徐々に増加していることがわかります。
オブジェクトの作成と破棄の監視は、デフォルトのコンストラクターとfinalizeメソッド(オブジェクトのfinalizeメソッドをオーバーライドする)にログステートメントを追加することによって行われます。オブジェクト作成のロギングステートメントは、予想どおりに表示されますが、finalizeメソッドのロギングステートメントは、セッションの有効期限が切れた後にのみ表示されます。Oracle JRocket Mission Controlを使用してガベージコレクションがトリガーされると、ヒープ使用量が大幅に減少しますが、finalizeメソッド呼び出しからのロギングは観察されません。
ガベージコレクターが、セッションから削除された後にビュースコープのオブジェクトを再利用できない理由について誰かが考えていますか?
前もって感謝します。