java - spring ConfigurableApplicationContext 内存泄漏

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

现在的问题是,如果有人调用杀死线程,我的 Spring 上下文永远不会关闭,并且内存泄漏。我该如何防止它?

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

最佳答案

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

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

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

关于java - spring ConfigurableApplicationContext 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27769167/

相关文章:

c++ - 这会导致 C++ 中的内存泄漏吗?

python - 使用 PyArray_SimpleNewFromData() 创建并返回数组时 Python 扩展中的内存泄漏

c - 在 C 中操作 PNG 图像导致内存泄漏或图像上出现白色条纹

java - 使用 fileWriter 重写一行

java - 在 smartGWT 的 Listgrid 中渲染嵌套 JSON 字符串

java - "__ Cannot be resolved to a type"- JavaFX 无法在 Eclipse 中使用 e(fx)clipse 插件工作

java - 将自定义身份验证包装到 Spring 安全性中的最简单方法?

java - 无法解析 XML 配置 Spring 应用程序中的占位符

java - 我的 Sql 自动增量不起作用正确地增量 3 by 3 条记录

java - 如何开启Spring WebFlux的访问日志?