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主题的代码 }
} 我有另一个类似于上面的侦听器,它正在侦听另一个JMS主题。 当我停止服务器时,服务器上出现以下错误 错误1: “web应用程序[/MyServlet]似乎已启动名为[thread-1]的线程,但未能停止该线程。这很可能会造成内存泄漏。” 错误2: “web应用程序[/MyServlet]似乎已启动名为[thread-2]的线程,但未能停止该线程。这很可能会造成内存泄漏。”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
为什么会发生错误?我们如何停止线程或如何修复它?我认为您只需要完全关闭线程 实现方法
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
}
}