Android系統(tǒng)不太突出進(jìn)程概念,因此靜態(tài)變量的生命周期也讓人感覺(jué)模糊。這種模糊對(duì)于值類型的靜態(tài)變量倒關(guān)系不大,但如果是靜態(tài)的對(duì)象引用,則與內(nèi)存回收、內(nèi)存泄漏密不可分。
靜態(tài)變量是在類被加載的時(shí)候分配內(nèi)存的,并且存在于方法區(qū)。當(dāng)類被卸載的時(shí)候,靜態(tài)變量被銷毀。
在JVM環(huán)境中,一個(gè)類被加載和卸載,可簡(jiǎn)單的等同于jvm進(jìn)程的啟動(dòng)和結(jié)束。
靜態(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é)。也就是說(shuō)在進(jìn)程啟動(dòng)的時(shí)候,類被加載,靜態(tài)變量被分配內(nèi)存。
靜態(tài)變量在類被卸載的時(shí)候銷毀
類在什么時(shí)候被卸載?
在進(jìn)程結(jié)束的時(shí)候。
說(shuō)明:一般情況下,所有的類都是默認(rèn)的ClassLoader加載的,只要ClassLoader存在,類就不會(huì)被卸載,而默認(rèn)的ClassLoader生命周期是與進(jìn)程一致的,這里討論一般情況。
Android中的進(jìn)程什么時(shí)候結(jié)束
這是Android對(duì)進(jìn)程和內(nèi)存管理不同于PC的核心——如果資源足夠,Android不會(huì)殺掉任何進(jìn)程,另一個(gè)意思就是進(jìn)程隨時(shí)可能會(huì)被殺掉。而Android會(huì)在資源夠的時(shí)候,重啟被殺掉的進(jìn)程。也就是說(shuō)靜態(tài)變量的值,如果不做處理,是不可靠的,可以說(shuō)內(nèi)存中的一切都不可靠。如果要可靠,還是得保存到數(shù)據(jù)庫(kù)或文件中,在重啟的時(shí)候恢復(fù)回來(lái)。
靜態(tài)引用的對(duì)象不會(huì)被垃圾回收
只要靜態(tài)變量沒(méi)有被銷毀也沒(méi)有置空,其對(duì)象一直被保持引用,也即引用計(jì)數(shù)不可能是0,因此不會(huì)被垃圾回收。因此,單例對(duì)象在運(yùn)行時(shí)不會(huì)被回收。