[轉]Android靜態變數的生命週期

來源:互聯網
上載者:User

標籤:

原文地址:https://my.oschina.net/jerikc/blog/137207

 

Android是用Java開發,其靜態變數的生命週期遵守Java的設計。我們知道靜態變數是在類被load的時候分配記憶體的,並且存在於方法區。當類被卸載的時候,靜態變數被銷毀。在PC機的用戶端程式中,一個類被載入和卸載,可簡單的等同於jvm進程的啟動和結束。那麼在Android中呢?用的Dalvik vm也是一樣的。不過Android不太突出的進程概念,所以對靜態變數的生命週期就會感覺模糊,這種模糊對於實值型別是無所謂的,如果是靜態對象引用,則與記憶體回收、記憶體流失這些問題有關,有必要加深研究和理解。 

一、靜態變數在類被載入的時候分配記憶體。 類在什麼時候被載入? 當我們啟動一個app的時候,系統會建立一個進程,此進程會載入一個Dalvik VM的執行個體,然後代碼就運行在DVM之上,類的載入和卸載,記憶體回收等事情都由DVM負責。也就是說在進程啟動的時候,類被載入,靜態變數被分配記憶體。 

二、靜態變數在類被卸載的時候銷毀。 類在什麼時候被卸載? 在進程結束的時候。 說明:一般情況下,所有的類都是預設的ClassLoader載入的,只要ClassLoader存在,類就不會被卸載,而預設的ClassLoader生命週期是與進程一致的,本文討論一般情況。 

三、Android中的進程什麼時候結束 這個是Android對進程和記憶體管理不同於PC的核心——如果資源足夠,Android不會殺掉任何進程,另一個意思就是進程隨時可能會被殺掉。而Android會在資源夠的時候,重啟被殺掉的進程。也就是說靜態變數的值,如果不做處理,是不可靠的,可以說記憶體中的一切都不可靠。如果要可靠,還是得儲存到Nand或SD卡中去,在重啟的時候恢複回來。 另一種情況就是不能把退出所有Activity等同於進程的退出,所以在使用者點擊表徵圖啟動應用的時候,以前存放於靜態變數中的值,有可能還存在,因此要視具體情況給予清空操作。 

四、Application也是一樣不可靠 Application其實是一個單例對象,也是放在記憶體中的,當進程被殺掉,就全清空了,只不過Android系統會幫重建Application,而我們存放在Application的資料自然就沒有了,還是得自己處理。 

五、靜態引用的對象不會被記憶體回收 只要靜態變數沒有被銷毀也沒有置null,其對象一直被保持引用,也即引用計數不可能是0,因此不會被記憶體回收。因此,單例對象在運行時不會被回收.

[轉]Android靜態變數的生命週期

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.