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,并让该线程中的代码定期检查中断。

如果这是来自您无法控制的调用代码,那么您就不走运了,因为此类代码意味着您无法正确控制上下文的生命周期。