spring ConfigurableApplicationContext 内存泄漏
memory leak with spring ConfigurableApplicationContext
public class Tasker{
ConfigurableApplicationContext context ;
public void load(){
context = = loadSpringContext();
}
pulic void doSomething(){
//do something
}
public void close(){
context.close();
}
}
public class Caller extends Thread {
public void run(){
Tasker tasker = new Tasker();
try{
tasker.load();
tasker.doSomething();
}finally(){
tasket.close();
}
}
}
//sample driver code which is not in my control
Caller caller = new Caller()
caller.start();
caller.stop();
现在的问题是,如果有人调用 kills 线程,我的 Spring 上下文永远不会关闭,它是一个内存 leak.How 我可以阻止它吗?
注意:我无法更改驱动程序代码。
Thread.stop
是邪恶的并且被严重弃用,永远不应该使用。它使线程没有机会自行清理。在您的情况下,可能永远不会调用 Tasker.close
方法,因为线程 立即停止 。您可以通过在 Tasker
方法中放入一些日志语句来验证这一点,这些语句会在实际发生时打印出来。
最好改用 Thread.interrupt
,并让该线程中的代码定期检查中断。
如果这是来自您无法控制的调用代码,那么您就不走运了,因为此类代码意味着您无法正确控制上下文的生命周期。
public class Tasker{
ConfigurableApplicationContext context ;
public void load(){
context = = loadSpringContext();
}
pulic void doSomething(){
//do something
}
public void close(){
context.close();
}
}
public class Caller extends Thread {
public void run(){
Tasker tasker = new Tasker();
try{
tasker.load();
tasker.doSomething();
}finally(){
tasket.close();
}
}
}
//sample driver code which is not in my control
Caller caller = new Caller()
caller.start();
caller.stop();
现在的问题是,如果有人调用 kills 线程,我的 Spring 上下文永远不会关闭,它是一个内存 leak.How 我可以阻止它吗?
注意:我无法更改驱动程序代码。
Thread.stop
是邪恶的并且被严重弃用,永远不应该使用。它使线程没有机会自行清理。在您的情况下,可能永远不会调用 Tasker.close
方法,因为线程 立即停止 。您可以通过在 Tasker
方法中放入一些日志语句来验证这一点,这些语句会在实际发生时打印出来。
最好改用 Thread.interrupt
,并让该线程中的代码定期检查中断。
如果这是来自您无法控制的调用代码,那么您就不走运了,因为此类代码意味着您无法正确控制上下文的生命周期。