我有一个使用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