Memory leaks 如果在tomcat服务器中的服务器启动时启动单个线程或多个线程,则会导致内存泄漏 我从web.xml文件调用了MyListener类 MyListener 导入javax.servlet.*; 公共类MyListener实现ServletContextListener{ public void contextInitialized(ServletContextEvent事件){ 试试{ (新线程(新SampleProcessor()).start(); }catch(异常e){e.printStackTrace();} } public void contextdestromed(ServletContextEvent arg0){} } 公共类SampleProcessor实现可运行{ 公开募捐{ //这里我们编写了侦听JMS主题的代码 }

Memory leaks 如果在tomcat服务器中的服务器启动时启动单个线程或多个线程,则会导致内存泄漏 我从web.xml文件调用了MyListener类 MyListener 导入javax.servlet.*; 公共类MyListener实现ServletContextListener{ public void contextInitialized(ServletContextEvent事件){ 试试{ (新线程(新SampleProcessor()).start(); }catch(异常e){e.printStackTrace();} } public void contextdestromed(ServletContextEvent arg0){} } 公共类SampleProcessor实现可运行{ 公开募捐{ //这里我们编写了侦听JMS主题的代码 },memory-leaks,tomcat7,Memory Leaks,Tomcat7,} 我有另一个类似于上面的侦听器,它正在侦听另一个JMS主题。 当我停止服务器时,服务器上出现以下错误 错误1: “web应用程序[/MyServlet]似乎已启动名为[thread-1]的线程,但未能停止该线程。这很可能会造成内存泄漏。” 错误2: “web应用程序[/MyServlet]似乎已启动名为[thread-2]的线程,但未能停止该线程。这很可能会造成内存泄漏。” 为什么会发生错误?我们如何停止线程或如何修复它?我认为您只需要完全关闭线程 实现方法contextDestroyed(S

} 我有另一个类似于上面的侦听器,它正在侦听另一个JMS主题。 当我停止服务器时,服务器上出现以下错误 错误1: “web应用程序[/MyServlet]似乎已启动名为[thread-1]的线程,但未能停止该线程。这很可能会造成内存泄漏。” 错误2: “web应用程序[/MyServlet]似乎已启动名为[thread-2]的线程,但未能停止该线程。这很可能会造成内存泄漏。”


为什么会发生错误?我们如何停止线程或如何修复它?

我认为您只需要完全关闭线程

实现方法
contextDestroyed(ServletContextEvent sce)
,并向线程发送终止信号

如何干净地停止线程:

否则,线程将被强制终止

下面是一个粗略的示例(尚未编译):


不,它没有解决我的问题Kevin seifret你能在上面的代码中做些更改来解决问题吗?如果(running==false){//你的线程函数应该退出}。我认为它看起来像这个公共布尔值running=true;public void run()在循环的每次迭代中。如果它不是
true
则从run()函数返回——线程干净地完成。iow:
If(!running){return;}
//在线程处理逻辑中
 I called the MyListener class from the web.xml file
<listener>  
  <listener-class>MyListener</listener-class>  
</listener>

import javax.servlet.*;  

public class MyListener implements ServletContextListener{  
  public void contextInitialized(ServletContextEvent event) {  
    try{  
        (new Thread(new SampleProcessor())).start();
    }catch(Exception e){e.printStackTrace();}  
  }  

  public void contextDestroyed(ServletContextEvent arg0) {}  
}  

public class SampleProcessor implements Runnable{

 public void run(){
 //Here we write the code for listening to a JMS Topic
}
public class MyListener implements ServletContextListener{  
  static Thread mythread = null;
  public void contextInitialized(ServletContextEvent event) {  
    try{  
        if ( null == mythread ) {
           mythread = new Thread(new SampleProcessor()));
           mytrhread.start();
       }
    }catch(Exception e){e.printStackTrace();}  
  }  

  public void contextDestroyed(ServletContextEvent arg0) {

       // your stop method here ...
       try{  
        if ( null != mythread ) {
           mythread.cleanStop();
           mytrhread.join();
       }
    }catch(Exception e){e.printStackTrace();}  
   }  
}  

public class SampleProcessor implements Runnable{

 public boolean running = false;
 public void run(){
 //Here we write the code for listening to a JMS Topic
   running = true; 
  }

 public void cleanStop(){
     //handle stopping the process here
      running = false;  // your main thread loop should test this var 
  }
}