小编Kon*_* B.的帖子

在Tomcat中重新部署应用程序时发生内存泄漏

我有部署在Tomcat 7.0.70中的WebApplication.我模拟了以下情况:

  1. 我创建了堆转储.
  2. 然后我发送了Http请求,并在服务的方法中打印了当前线程及其classLoader.然后我调用了Thread.currentThread.sleep(10000).
  3. 在同一时刻,我在Tomcat的管理页面中点击了"取消部署此应用程序".
  4. 我创建了新的堆转储.
  5. 几分钟后,我创建了新的肝转储.


结果


线程转储

在下面的屏幕上,您可以看到,在我单击"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)

java multithreading tomcat jvisualvm tomcat7

22
推荐指数
2
解决办法
3477
查看次数

标签 统计

java ×1

jvisualvm ×1

multithreading ×1

tomcat ×1

tomcat7 ×1