为什么这是内存泄漏

时间:2015-05-22 20:35:50

标签: android memory-leaks leakcanary

我遇到了一个名为LeakCanary的Android(Java)内存泄漏检测库,但无法理解它们泄漏内存的示例。任何人都可以解释他们的示例中显示的代码是如何以及为什么是内存泄漏。

class Cat {
}
class Box {
  Cat hiddenCat;
}
class Docker {
  static Box container;
}

// ...

Box box = new Box();
Cat schrodingerCat = new Cat();
box.hiddenCat = schrodingerCat;
Docker.container = box;

然后他们观察变量schrodingerCat是否泄漏,泄漏如下所示(我不知道如何与上述代码相关)。

* GC ROOT static Docker.container
* references Box.hiddenCat
* leaks Cat instance

任何有关泄漏解释以及检测与其相关的帮助都会非常有帮助。另外一些适合初学者的好文章也不错。

谢谢!

2 个答案:

答案 0 :(得分:1)

看起来RefWatcher实例用于“监视变量schrodingerCat是否泄漏”:

refWatcher.watch(schrodingerCat);

强制执行一组GC通过,如果在GC通过期间未收集传入的引用,则认为是泄漏。

由于静态Docker.container.hiddenCat保留了对最初称为schrodingerCat的对象的GC根引用,因此当您要求RefWatcher进行检查时,它无法进行GC管理。因此,它会让您知道无法收集该对象。

答案 1 :(得分:1)

我建议你阅读这个答案https://stackoverflow.com/a/11908685/1065810

它可能会帮助您理解上面的示例。

简而言之,在您的示例中,Docker类保留对Box的引用。即使不再需要容器盒,Docker类仍然保留对它的引用,从而造成内存泄漏。

如果有帮助,请告诉我。