【问题标题】:Ensuring resources are destroyed using JAX-RS, Tomcat and Guice确保使用 JAX-RS、Tomcat 和 Guice 销毁资源
【发布时间】:2025-11-28 05:15:01
【问题描述】:

我有一个使用 Tomcat 6 提供的 JAX-RS Web 服务。我正在使用 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);
         }
      });
   }
}

那我是不是很傻?我在哪里捕获请求或应用上下文的结尾?

【问题讨论】:

    标签: tomcat6 jax-rs guice guice-servlet


    【解决方案1】:

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

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

    我不知道任何内存泄漏本身,但 guice-servlet 重新实现了整个 Servlet 基础架构,请参阅 f.e.那些错误: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

    【讨论】: