为什么Spring Context没有优雅地关闭?

时间:2013-05-09 14:38:34

标签: spring-mvc memory-leaks permgen servlet-listeners servletcontextlistener

在基于stop的网络应用程序的undeploy/redeploySpring framework 3.0.5上,Tomcat7's catalina.out会记录以下错误:

SEVERE: The web application [/nomination##1.0-qa] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@4f43af8f]) and a value of type [org.springframework.security.core.context.SecurityContextImpl] (value [org.springframework.security.core.context.SecurityContextImpl@ffffffff: Null authentication]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.

我最初想过在那里实现ServletContextListenerclose()上下文。但是,在ContextLoaderListener中设置了ServletContextListener实现web.xml的{​​{1}}:

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

来自Javadocs:

**contextDestroyed**

public void contextDestroyed(ServletContextEvent event)
Close the root web application context.
Specified by:
contextDestroyed in interface ServletContextListener

所以,我的问题是为什么ThreadLocal没有被ContextLoaderListener.contextDestroyed()干净地释放?

我们遇到PermGen错误,而调查发现了这一点。在以下几个地方有类似的代码:

ApplicationContext context = WebApplicationContextUtils
            .getWebApplicationContext(se.getSession().getServletContext());

MyBeanClass x = context.getBean(
            "myBean", MyBeanClass.class);
x.someMethod(); 

我想知道上面的片段是否正在停止干净关闭? 任何指针都将非常感激。

1 个答案:

答案 0 :(得分:0)

您应该关注hotdeploy存在的许多问题:

1 - 取消注册数据库驱动程序see here

2 - 多任务应用程序中的关闭任务:您可能会在开发模式中延迟重启几乎1小时。

3-kill春天的背景:你上面做过但要注意不要导入XML格式的XML。

4-kill JVM内存中存在的缓存对象:make small object,是否正在初始化 bean在构造函数中?将其更改为无构造函数以在方法范围内保留它们! 类调用bean有多少方法?如果很多方法调用bean从范围出来之后不要指望java kill对象,jvm会保持它的性能..所以保持你的类小!。

你的代码怎么样?你在循环中声明变量吗?你是否在使用后是空列表或对象?

5-你可以增加tomcat的开始时间和停止时间。

也将rebel或springboot项目视为帮助者。