搜尋

首頁  >  問答  >  主體

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

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

public staitc final List xxx = new List..

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

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

伊谢尔伦伊谢尔伦2767 天前616

全部回覆(4)我來回復

  • 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幾個相關標準一時之間找不到文件,按著印象寫的....

    回覆
    0
  • 巴扎黑

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

    我覺的在程式突出的時候jvm銷毀的時候才會釋放這段記憶體。

    回覆
    0
  • 阿神

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

    我在C#中遇到了類似的問題。
    Dictionary是static的。
    有個static的方法是new,然後Add。
    最後直接無法new了。

    我有個問題想問一下。
    一個static的Dictionary。
    有個static的方法new了以後Add,
    然後一個static的方法Remove。
    記憶體釋放掉了什麼?

    回覆
    0
  • 大家讲道理

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

    1樓說的已經很對了,我這裡只是作為補充一下:

    堆疊(stack):是簡單的資料結構,但在電腦中使用廣泛。堆疊最顯著的特徵是:LIFO(Last In, First Out,
    後進先出)。例如我們往箱子裡面放衣服,先放入的在最下方,只有拿出後來放入的才能拿到下方的衣服。棧中只存放基本型別和物件的參考(不是物件)。

    堆(heap):堆記憶體用來存放由new建立的物件和陣列。在堆中分配的內存,由java虛擬機器自動垃圾回收器來管理。 JVM只有一個堆區(heap)被所有執行緒共享,堆中不存放基本型別和物件引用,只存放物件本身。

    方法區(method):又叫靜態區,跟堆一樣,被所有的執行緒共用。方法區包含所有的class和static變數。

    關於記憶體外洩的問題,強烈建議了解下這兩篇文章
    Android記憶體外洩-全解析與處理辦法
    Android記憶體外洩的八種可能

    回覆
    0
  • 取消回覆