Android 静态常量对象什么时候被回收?
伊谢尔伦
伊谢尔伦 2017-04-17 12:58:23
0
4
610

发现在自己做事件中心,或者是 activty manage 时,都会定义类似下面的代码:

public staitc final List xxx = new List..

有内容添加进,调用 list 的 add 方法,保存内容。
这个现在也也没什么更好的办法来代替。

那么问题来了,系统什么时候会回收这个 list 的内容呢?

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

모든 응답(4)
洪涛

如果你没有设置 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变量。

关于内存泄露的问题,强烈建议了解下这两篇文章
Android内存泄露——全解析和处理办法
Android内存泄漏的八种可能

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!