发现在自己做事件中心,或者是 activty manage 时,都会定义类似下面的代码:
public staitc final List xxx = new List..
有内容添加进,调用 list 的 add 方法,保存内容。
这个现在也也没什么更好的办法来代替。
那么问题来了,系统什么时候会回收这个 list 的内容呢?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
如果你没有设置 xxx = null
那么你可以认为在Application终止前,该内存永远不会回收.
如果你设置了null.那么在GC时会释放.
为什么不会回收?
静态对象的引用在方法区里. 方法区不参与GC.
Java Heap分为3个区
1.Young 年轻代
2.Old 老年代
3.Permanent 持久代,也有的JVM实现里叫 Method Area 方法区,具体取决于JVM实现.
所有类信息,类的静态变量都在 持久代 中
当你new 一个对象,申请内存的时候,首先是在年轻代中申请内存.如果失败了,会触发一次 Minor GC.
Minor GC只会释放 年轻代 中的内存,并把仍存活的且符合条件的 对象 从年轻代 移入老年代.
如果Minor GC后 内存仍然不足,此时会触发一次 Full GC.
Full GC会释放老年代 和 持久代 中未被使用的对象(?)
如果是JAVA程序,那么 静态常量 有 可能在 FULL GC时和 class本身一起被回收.
(?)这个依赖具体虚拟机实现 有的虚拟机实现里 持久代/方法区 不参与GC
dalvik虚拟机中
只有 GC堆 和 方法区
方法区 不参与GC
你可以姑且认为它永远不会被释放.
注: 以上是根据JVM标准进行的分析,某些部分是依赖具体虚拟机实现的
dalvik几个相关标准一时之间找不到文档,按着印象写的....
我觉的在程序突出的时候jvm销毁的时候才会释放这段内存。
我在C#中遇到相似的问题了。
Dictionary是static的。
有个static的方法是new,然后Add。
最后直接无法new了。
我有个问题想问一下。
一个static的Dictionary。
有个static的方法new了以后Add,
然后一个static的方法Remove。
内存释放掉了么?
1楼说的已经很对了,我这里只是作为补充一下:
关于内存泄露的问题,强烈建议了解下这两篇文章
Android内存泄露——全解析和处理办法
Android内存泄漏的八种可能