セッション Bean であるナビゲーション ツリーを持つアプリケーションに取り組んでいます。この Bean を含むページを呼び出すたびに、メモリ使用量が増加します。ただし、非アクティブ状態が数時間続くと、メモリはまだ解放されません。これが発生する理由や回避策はありますか?
2 に答える
Java アプリのメモリについて何が起こっているかを知るには、プロファイラーを使用する必要があります。Eclipse プロファイラーはかなり優れています。
セッション Bean の場合、同じセッション内のページでヒットするたびにインスタンス化する必要はありません。
また、GC はすぐにはクラスを収集しないことに注意する必要があります。また、GC は必ずしも時間に依存するとは限りません。
セッション タイムアウトは、デプロイメント記述子で明示的に設定するか、プログラムで設定できます (ただし、JSF アプリケーションではおそらくそうしたくないでしょう)。
最終的に、これはコンテナーの制御下にあります。サーバーは、論理的な有効期限の設定に関係なく、いつリソースを解放するかを管理します。
リスナーを使用して、何が起こっているのかを診断するのに役立ちます。たとえば、Bean クラスにHttpSessionBindingListenerを実装させることができます。セッションに追加または削除されると通知されます。または、 HttpSessionAttributeListenerを使用してすべてのセッション イベントを監視することもできます(JSF はセッションを使用してビュー ステートを管理できるため、自分で定義していないエントリがいくつかあることを想定してください)。HttpSessionAttributeListener は web.xml で定義されています。
<listener>
<display-name>MyListener</display-name>
<listener-class>
somepackage.MySessionDiagnosticListenerImpl
</listener-class>
</listener>
サーバーを非アクティブのままにしている場合は、期限切れのセッションのクリーンアップをトリガーするために他のセッション要求に依存しており、実装の詳細を観察している可能性があります。または、アンマネージ クラスでオブジェクトへの参照を設定したために、メモリ リークが発生している可能性があります。