我有部署在Tomcat 7.0.70中的WebApplication.我模拟了以下情况:
结果
线程转储
在下面的屏幕上,您可以看到,在我单击"redeploy"之后,除了线程"http-apr-8081-exec-10"之外,所有线程(与此Web应用程序关联)都被终止.当我设置Tomcat的属性"renewThreadsWhenStoppingContext == true"时,你可以看到一段时间后这个线程("http-apr-8081-exec-10")被杀死并且新线程(http-apr-8081-exec-11) )而不是它.所以我没想到在创建堆转储3之后会有旧的WCL,因为没有任何旧的线程或对象.
堆转储1
在以下两个屏幕上,您可以看到当应用程序运行时,只有一个WCL(其参数"started"= true).线程"http-apr-8081-exec-10"有contextClassLoader = URLClassLoader(因为它在Tomcat的池中).我只是谈论这个线程,因为你将能够看到这个线程将处理我未来的HTTP请求.
发送HTTP请求
现在我发送HTTP请求,并在我的代码中获取有关当前线程的信息.您可以看到我的请求由线程"http-apr-8081-exec-10"处理
??? 23, 2016 9:28:16 AM c.c.c.f.s.r.ReportGenerationServiceImpl INFO: request has been handled in
thread = http-apr-8081-exec-10, its contextClassLoader = WebappClassLoader
context: /hdi
delegate: false
repositories:
/WEB-INF/classes/
----------> Parent Classloader: java.net.URLClassLoader@4162ca06
Run Code Online (Sandbox Code Playgroud)
然后我单击"重新部署我的Web应用程序",我在控制台中收到以下消息.
??? 23, 2016 9:28:27 AM org.apache.catalina.loader.WebappClassLoaderBase clearReferencesThreads
SEVERE: The web application [/hdi] appears to have started a thread named [http-apr-8081-exec-10] but has failed to stop it. This is very likely …Run Code Online (Sandbox Code Playgroud)