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記憶體外洩的八種可能