大佬教程收集整理的这篇文章主要介绍了android – 为什么这是内存泄漏,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
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
任何帮助解释泄漏和检测如何与它相关将是非常有帮助的.还有一些很好的文章,初学者会很好.
谢谢!
定义
内存泄漏是RAM中的数据分配(位图,对象,数组等),垃圾收集器(GC)无法释放,尽管程序不再需要它.
例
用户正在打开一个显示图像的视图.我们将位图加载到内存中.现在用户退出视图,并且图像不再需要,并且没有代码引用它.在那一刻,GC开始起作用,并将其从内存中删除.但是,如果我们仍然提到它,GC将不知道它可以删除,它将留在RAM中,占用不必要的空间 – 也就是内存泄漏.
猫在盒子里
假设@R_135_9616@程序中有一个Cat对象,我们把它保存在一个Box对象中.如果我们按住Box(对Box对象的引用),Box保存Cat,GC将无法从内存中清除Cat对象.
Docker是一个对我们的Box有静态引用的类.这意味着,除非我们取消它,否则重新分配值,Docker将继续引用Box.防止盒子(和内猫)从GC中被从记忆体中除去.
那么,我们需要猫吗?它是否仍然适用于应用程序?
这取决于开发人员决定我们需要多长时间. LeakCanary和其他诊断工具建议可能的内存泄漏.他们认为对象(Cat)可能不再需要了,所以他们警告这是一个泄漏.
翻新
在该示例中,它们给出了内存泄漏的常见情况.当使用静态引用时,我们阻止了GC清理对象.你应该读这个:
* GC ROOT static Docker.container * references Box.hiddenCat * leaks Cat instance
如:
>对象猫可能不会被使用,但是GC没有被从内存中删除.>对象Cat未被删除的原因是Box正在引用它.>对象Box未被删除的原因是因为Docker具有静态引用.> Docker的静态引用是导致可能泄漏的树的ROOT.
以上是大佬教程为你收集整理的android – 为什么这是内存泄漏全部内容,希望文章能够帮你解决android – 为什么这是内存泄漏所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。