发现在自己做事件中心,或者是 activty manage 时,都会定义类似下面的代码:
public staitc final List xxx = new List..
有内容添加进,调用 list 的 add 方法,保存内容。
这个现在也也没什么更好的办法来代替。
那么问题来了,系统什么时候会回收这个 list 的内容呢?
PHP中文网2017-04-17 13:00:23
如果你没有设置 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几个相关标准一时之间找不到文档,按着印象写的....
阿神2017-04-17 13:00:23
我在C#中遇到相似的问题了。
Dictionary是static的。
有个static的方法是new,然后Add。
最后直接无法new了。
我有个问题想问一下。
一个static的Dictionary。
有个static的方法new了以后Add,
然后一个static的方法Remove。
内存释放掉了么?
大家讲道理2017-04-17 13:00:23
1楼说的已经很对了,我这里只是作为补充一下:
栈(stack):是简单的数据结构,但在计算机中使用广泛。栈最显著的特征是:LIFO(Last In, First Out,
后进先出)。比如我们往箱子里面放衣服,先放入的在最下方,只有拿出后来放入的才能拿到下方的衣服。栈中只存放基本类型和对象的引用(不是对象)。堆(heap):堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。JVM只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身。
方法区(method):又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
关于内存泄露的问题,强烈建议了解下这两篇文章
Android内存泄露——全解析和处理办法
Android内存泄漏的八种可能