弹簧ConfigurableApplicationContext导致内存泄漏

时间:2015-01-04 18:56:11

标签: java spring memory-leaks garbage-collection

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();

现在的问题是,如果somone调用杀死线程,我的Spring上下文永远不会被关闭,而且它是一个记忆泄漏。我怎么能阻止它呢?

注意:我无法更改驱动程序代码。

1 个答案:

答案 0 :(得分:1)

Thread.stop是邪恶的,并且大量弃用,永远不应该被使用。它使线程无法自行清理。在您的情况下,可能永远不会调用Tasker.close方法,因为线程会立即停止 。您可以通过在Tasker方法中放入一些日志语句来验证这一点,这些方法在实际发生时打印出来。

最好使用Thread.interrupt代替,并且该线程中的代码定期检查中断。

如果这是来自你无法控制的调用代码那么你运气不好,因为这样的代码意味着你无法正确控制你的上下文的生命周期。