Android靜態(tài)變量的生命周期 簡(jiǎn)單介紹
Android是用Java開發(fā),其靜態(tài)變量的生命周期遵守Java的設(shè)計(jì)。我們知道靜態(tài)變量是在類被load的時(shí)候分配內(nèi)存的,并且存在于方法區(qū)。當(dāng)類被卸載的時(shí)候,靜態(tài)變量被銷毀。在PC機(jī)的客戶端程序中,一個(gè)類被加載和卸載,可簡(jiǎn)單的等同于jvm進(jìn)程的啟動(dòng)和結(jié)束。那么在Android中呢?用的Dalvik vm也是一樣的。不過Android不太突出的進(jìn)程概念,所以對(duì)靜態(tài)變量的生命周期就會(huì)感覺模糊,這種模糊對(duì)于值類型是無所謂的,如果是靜態(tài)的對(duì)象引用,則與內(nèi)存回收、內(nèi)存泄漏這些問題有關(guān),有必要加深研究和理解。
一、靜態(tài)變量在類被加載的時(shí)候分配內(nèi)存。
類在什么時(shí)候被加載?
當(dāng)我們啟動(dòng)一個(gè)app的時(shí)候,系統(tǒng)會(huì)創(chuàng)建一個(gè)進(jìn)程,此進(jìn)程會(huì)加載一個(gè)Dalvik VM的實(shí)例,然后代碼就運(yùn)行在DVM之上,類的加載和卸載,垃圾回收等事情都由DVM負(fù)責(zé)。也就是說在進(jìn)程啟動(dòng)的時(shí)候,類被加載,靜態(tài)變量被分配內(nèi)存。
二、靜態(tài)變量在類被卸載的時(shí)候銷毀。
類在什么時(shí)候被卸載?
在進(jìn)程結(jié)束的時(shí)候。
說明:一般情況下,所有的類都是默認(rèn)的ClassLoader加載的,只要ClassLoader存在,類就不會(huì)被卸載,而默認(rèn)的ClassLoader生命周期是與進(jìn)程一致的,本文討論一般情況。
三、Android中的進(jìn)程什么時(shí)候結(jié)束
這個(gè)是Android對(duì)進(jìn)程和內(nèi)存管理不同于PC的核心——如果資源足夠,Android不會(huì)殺掉任何進(jìn)程,另一個(gè)意思就是進(jìn)程隨時(shí)可能會(huì)被殺掉。而Android會(huì)在資源夠的時(shí)候,重啟被殺掉的進(jìn)程。也就是說靜態(tài)變量的值,如果不做處理,是不可靠的,可以說內(nèi)存中的一切都不可靠。如果要可靠,還是得保存到Nand或SD卡中去,在重啟的時(shí)候恢復(fù)回來。
另一種情況就是不能把退出所有Activity等同于進(jìn)程的退出,所以在用戶點(diǎn)擊圖標(biāo)啟動(dòng)應(yīng)用的時(shí)候,以前存放于靜態(tài)變量中的值,有可能還存在,因此要視具體情況給予清空操作。
四、Application也是一樣不可靠
Application其實(shí)是一個(gè)單例對(duì)象,也是放在內(nèi)存中的,當(dāng)進(jìn)程被殺掉,就全清空了,只不過Android系統(tǒng)會(huì)幫重建Application,而我們存放在Application的數(shù)據(jù)自然就沒有了,還是得自己處理。
五、靜態(tài)引用的對(duì)象不會(huì)被垃圾回收
只要靜態(tài)變量沒有被銷毀也沒有置null,其對(duì)象一直被保持引用,也即引用計(jì)數(shù)不可能是0,因此不會(huì)被垃圾回收。因此,單例對(duì)象在運(yùn)行時(shí)不會(huì)被回收
相關(guān)文章
解決Android TabLayout 在寬屏幕上tab不能平均分配的問題
這篇文章主要介紹了解決Android TabLayout 在寬屏幕上tab不能平均分配的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-08-08
Android組件化工具ARouter使用方法詳細(xì)分析
這篇文章主要介紹了Android組件化工具ARouter使用方法,組件化項(xiàng)目存在各個(gè)模塊之間耦合,通信麻煩的問題,為了解決這個(gè)問題,阿里巴巴的開發(fā)者就搞出了Arouter這個(gè)框架,以解決上述問題2022-10-10
Android中Activity生命周期和啟動(dòng)模式詳解
這篇文章主要介紹了Activity生命周期和啟動(dòng)模式詳解的相關(guān)資料,需要的朋友可以參考下2016-07-07
Android實(shí)現(xiàn)外部喚起應(yīng)用跳轉(zhuǎn)指定頁面的方法
這篇文章主要給大家介紹了關(guān)于Android實(shí)現(xiàn)外部喚起應(yīng)用跳轉(zhuǎn)指定頁面的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12
Android 動(dòng)態(tài)改變布局實(shí)例詳解
這篇文章主要介紹了Android 動(dòng)態(tài)改變布局實(shí)例詳解的相關(guān)資料,這里舉例說明如何實(shí)現(xiàn)動(dòng)態(tài)改變布局的例子,幫助大家學(xué)習(xí)理解,需要的朋友可以參考下2016-11-11
Android編程設(shè)置全屏的方法實(shí)例詳解
這篇文章主要介紹了Android編程設(shè)置全屏的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android設(shè)置全屏的兩種常見技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-11-11
Android 使用Zbar實(shí)現(xiàn)掃一掃功能
這篇文章主要介紹了Android 使用Zbar實(shí)現(xiàn)掃一掃功能,本文用的是Zbar實(shí)現(xiàn)掃一掃,因?yàn)楦鶕?jù)本人對(duì)兩個(gè)庫(kù)的使用比較,發(fā)現(xiàn)Zbar解碼比Zxing速度要快,實(shí)現(xiàn)方式也簡(jiǎn)單,需要的朋友可以參考下2023-03-03
Android編程實(shí)現(xiàn)隱藏狀態(tài)欄及測(cè)試Activity是否活動(dòng)的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)隱藏狀態(tài)欄及測(cè)試Activity是否活動(dòng)的方法,涉及Android界面布局設(shè)置及Activity狀態(tài)操作的相關(guān)技巧,需要的朋友可以參考下2016-10-10

