确保使用JAX-RS、Tomcat和Guice销毁资源



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

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

如果我不断刷新针对服务的请求,我可以看到Tomcat的内存使用量会攀升,直到我回收Tomcat时才会减少。

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

我使用创建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);
         }
      });
   }
}

那么我是在装傻吗?在哪里可以获取请求的末尾或应用程序上下文?

我建议切换到常规servlet并删除guide servlet扩展,至少可以找到原因。

附加的Guice库(例如,Guiceservlet、Guicepersistent)相当bug。

我不知道任何内存泄漏本身,但guide-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

最新更新