2

session.invalidate()はhttpsessionを解放することを知っています。しかしコンテナのメモリを監視すると落ちません。ここに私が観察しているものがあります-

  • ログイン (私のアプリケーションはセッションを作成します)
  • ユーザーは、プロセス メモリを増やすアクティビティを実行します。
  • ログアウト。(ログアウトコントローラーはセッションを明示的に無効にします)
  • プロセス メモリを監視します。それは決して降りません。

最初は、ガベージ コレクションは、使用可能なメモリが少ない状態に達した後にのみ機能するのではないかと考えていました。これを確認するために、-Xmx を使用してメモリを減らしました。しかし、それでも同じエラーです。実際、別のブラウザで同じアクティビティを実行すると、OOM エラーが発生しました。

ここに欠けているものはありますか?

4

2 に答える 2

1

次のいずれかを試して、問題を分析できます。

  1. GC ログを出力し、Young/Full GC コレクションが発生したかどうか、および発生した回数を確認します。

    -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log -XX:+HeapDumpOnOutOfMemoryError -Xloggc:bin/gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -verbose:gc

  2. クラス ヒストグラムをチェックして、クラスのインスタンスがフル GC によって収集されているかどうかを確認します。フル GC 前後のインスタンス数を比較します。有効 :

    -XX:+PrintClassHistogramBeforeFullGC -XX:+PrintClassHistogramAfterFullGC

  3. クラスが収集されているかどうかを確認するために、ヒストグラムのスナップショットをもう一度取得します。

    jmap -histo $pid

  4. GC 中にオブジェクトが収集されないようにする finalize() メソッドがクラスに含まれているかどうかを確認します。

  5. GargantuChet が提案したように、HeapDump を収集し、クラス インスタンスを参照しているオブジェクトを確認します。

于 2012-12-07T22:20:10.653 に答える
1

ガベージ コレクターが実行され、参照されていないオブジェクトを見つけてクリーンアップするまで、メモリ内に存在します。テスト目的でSystem.gc()afterを使用して、GC を明示的に呼び出すことができます。session.invalidate()またSystem.gc()、jvm が GC を実行するかどうかを決定するため、呼び出しで GC を呼び出す必要はありません。

于 2012-12-06T16:42:23.050 に答える