8

コンテキストのリロード中に、複数の MemoryLeaks (catalina.out にある) が発生しています。

これらのスレッドをクリーンアップするために、ServletContextListener の実装を作成しました。

ログエントリを確認できるため、コンテキストが作成されるcontextInitialized()とメソッドが正常に呼び出されます。

しかし、contextDestroyed()メソッドは呼び出されないため、クリーンアップ コードは呼び出されません。なぜこれが起こっているのですか?

コンテキストをリロードする必要があるときに通知されるように、別のインターフェイスを実装する必要がありますか?

public class MyContextListener implements ServletContextListener {

    private static final Logger log = Logger.getLogger(MyContextListener.class);

    @Override
    public void contextDestroyed(final ServletContextEvent arg0) {
        MyContextListener.log.info("destroying Servlet Context");
        //Do stuff
        MyContextListener.log.info("Servlet Context destroyed");
    }

    @Override
    public void contextInitialized(final ServletContextEvent arg0) {
        try {
            MyContextListener.log.info("Creating Servlet Context");
            //Do stuff
        } finally {
            MyContextListener.log.info("Servlet Context created");
        }
    }
}
4

2 に答える 2

0

私が見る限り、いくつかの問題があります。

  1. サーブレットとフィルターは contextDestroyed が呼び出される前に完全に破棄されるため、一部のタスクには遅すぎる可能性があります。ただし、Tomcat がこのメソッドを呼び出す前に潜在的なメモリ リークを報告する理由はわかりません。:-/
  2. このメソッドが呼び出される前に、クラス ローダーが無効になっているようです (フィルターやサーブレットの destroy メソッドにも当てはまる可能性があります)。:-(
于 2014-01-31T11:02:05.730 に答える