在基于stop
的网络应用程序的undeploy/redeploy
或Spring 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.
我最初想过在那里实现ServletContextListener
和close()
上下文。但是,在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();
我想知道上面的片段是否正在停止干净关闭? 任何指针都将非常感激。
答案 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项目视为帮助者。