0

我有一个使用 Tomcat 6 提供的 JAX-RS 网络服务。我正在使用 Guice 注入我的资源并创建 Servlet。

我肯定有内存泄漏,我认为这是因为我没有处理请求的结束或应用程序的关闭。

如果我不断刷新针对该服务的请求,我可以看到 Tomcat 的内存使用量会攀升并且在我回收 Tomcat 之前不会减少。

我尝试过 RTFM,但我并没有探索生命周期。

我使用创建 Servlet

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

我建议切换到常规 servlet 并删除 guice-servlet 扩展,至少要找到它是否是原因。

附加的 Guice 库(例如 guice-servlet、guice-persist)相当有缺陷。

我不知道任何内存泄漏本身,但 guice-servlet 重新实现了整个 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/ servlet/GuiceFilter.java

于 2013-02-19T09:52:54.393 回答