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

发现在自己做事件中心,或者是 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學習者快速成長!