【问题标题】:memory leak with spring ConfigurableApplicationContextspring ConfigurableApplicationContext 内存泄漏
【发布时间】:2015-01-04 18:56:11
【问题描述】:
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 上下文永远不会关闭并且它是内存泄漏。我该如何防止它?

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

【问题讨论】:

  • 线程通常不会在 JVM 中“杀死”。 Thread.stop() 方法已弃用,不应使用。 “某人”是如何阻止tasket.close()被调用的?

标签: java spring memory-leaks garbage-collection


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多