0

Tomcat 6 を使用して JAX-RS Web サービスを提供しています。Guice を使用してリソースを注入し、サーブレットを作成しています。

間違いなくメモリ リークが発生しました。これは、リクエストの終了またはアプリのシャットダウンを処理していないためだと思います。

サービスに対する要求を継続的に更新すると、Tomcat のメモリ使用量が増加し、Tomcat をリサイクルするまで減少しないことがわかります。

RTFM を試みましたが、ライフサイクルを理解していません。

を使用してサーブレットを作成します

public class RadWebServiceServletConfig extends GuiceServletContextListener {
   @Override
   protected Injector getInjector() {
      return Guice.createInjector(new JerseyServletModule() {
         @Override
         protected void configureServlets() {
            // Must configure at least one JAX-RS resource or the 
            // server will fail to start.
            bind(Crags.class);
            bind(IDataFacade.class).to(DataFacade.class);
            bind(IRepository.class).to(Repository.class);
             //filter all requests to log
            filter("/*").through(LoggingFilter.class);

            // Route all requests through GuiceContainer
            Map<String, String> params = new HashMap<String, String>();
            params.put("com.sun.jersey.spi.container.ContainerRequestFilters",
                        "com.sun.jersey.api.container.filter.GZIPContentEncodingFilter");
            params.put("com.sun.jersey.spi.container.ContainerResponseFilters",
                    "com.sun.jersey.api.container.filter.GZIPContentEncodingFilter");
            serve("/*").with(GuiceContainer.class, params);
         }
      });
   }
}

それで私はばかげているのですか?リクエストまたはアプリ コンテキストの終了はどこでキャッチできますか?

4

1 に答える 1

0

通常のサーブレットに切り替えて、guice-servlet拡張機能を削除することをお勧めします。少なくとも、それが原因であるかどうかを確認するためです。

追加のGuiceライブラリ(guice-servlet、guice-persistなど)はかなりバグがあります。

メモリリーク自体については知りませんが、guice-servletはサーブレットインフラストラクチャ全体を再実装します。これらのバグを参照してください:http://code.google.com/p/google-guice/issues/list? q = RequestDispatcher

また、ThreadLocalを使用しています。メモリリークについて言及した場合は、すぐに疑われるはずです。http://code.google.com/p/google-guice/source/browse/extensions/servlet/src/com/google/inject/を参照してください。サーブレット/GuiceFilter.java

于 2013-02-19T09:52:54.393 に答える