84669인 학습
152542인 학습
20005인 학습
5487인 학습
7821인 학습
359900인 학습
3350인 학습
180660인 학습
48569인 학습
18603인 학습
40936인 학습
1549인 학습
1183인 학습
32909인 학습
发现在自己做事件中心,或者是 activty manage 时,都会定义类似下面的代码:
public staitc final List xxx = new List..
有内容添加进,调用 list 的 add 方法,保存内容。 这个现在也也没什么更好的办法来代替。
那么问题来了,系统什么时候会回收这个 list 的内容呢?
小伙看你根骨奇佳,潜力无限,来学PHP伐。
如果你没有设置 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楼说的已经很对了,我这里只是作为补充一下:
栈(stack):是简单的数据结构,但在计算机中使用广泛。栈最显著的特征是:LIFO(Last In, First Out,后进先出)。比如我们往箱子里面放衣服,先放入的在最下方,只有拿出后来放入的才能拿到下方的衣服。栈中只存放基本类型和对象的引用(不是对象)。 堆(heap):堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。JVM只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身。 方法区(method):又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
栈(stack):是简单的数据结构,但在计算机中使用广泛。栈最显著的特征是:LIFO(Last In, First Out,后进先出)。比如我们往箱子里面放衣服,先放入的在最下方,只有拿出后来放入的才能拿到下方的衣服。栈中只存放基本类型和对象的引用(不是对象)。
堆(heap):堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。JVM只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身。
方法区(method):又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
关于内存泄露的问题,强烈建议了解下这两篇文章Android内存泄露——全解析和处理办法Android内存泄漏的八种可能
如果你没有设置 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内存泄漏的八种可能