recherche

Maison  >  Questions et réponses  >  le corps du texte

Android 静态常量对象什么时候被回收?

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

public staitc final List xxx = new List..

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

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

伊谢尔伦伊谢尔伦2767 Il y a quelques jours615

répondre à tous(4)je répondrai

  • PHP中文网

    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几个相关标准一时之间找不到文档,按着印象写的....

    répondre
    0
  • 巴扎黑

    巴扎黑2017-04-17 13:00:23

    我觉的在程序突出的时候jvm销毁的时候才会释放这段内存。

    répondre
    0
  • 阿神

    阿神2017-04-17 13:00:23

    我在C#中遇到相似的问题了。
    Dictionary是static的。
    有个static的方法是new,然后Add。
    最后直接无法new了。

    我有个问题想问一下。
    一个static的Dictionary。
    有个static的方法new了以后Add,
    然后一个static的方法Remove。
    内存释放掉了么?

    répondre
    0
  • 大家讲道理

    大家讲道理2017-04-17 13:00:23

    1楼说的已经很对了,我这里只是作为补充一下:

    栈(stack):是简单的数据结构,但在计算机中使用广泛。栈最显著的特征是:LIFO(Last In, First Out,
    后进先出)。比如我们往箱子里面放衣服,先放入的在最下方,只有拿出后来放入的才能拿到下方的衣服。栈中只存放基本类型和对象的引用(不是对象)。

    堆(heap):堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。JVM只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身。

    方法区(method):又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。

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

    répondre
    0
  • Annulerrépondre