Android系統(tǒng)不太突出進(jìn)程概念氢架,因此靜態(tài)變量的生命周期也讓人感覺模糊蘑辑。這種模糊對于值類型的靜態(tài)變量倒關(guān)系不大深浮,但如果是靜態(tài)的對象引用屈糊,則與內(nèi)存回收澡刹、內(nèi)存泄漏密不可分字旭。
靜態(tài)變量是在類被加載的時候分配內(nèi)存的锉矢,并且存在于方法區(qū)藕溅。當(dāng)類被卸載的時候棚壁,靜態(tài)變量被銷毀杯矩。
在JVM環(huán)境中,一個類被加載和卸載袖外,可簡單的等同于jvm進(jìn)程的啟動和結(jié)束史隆。
靜態(tài)變量在類被加載的時候分配內(nèi)存
類什么時候被加載?
當(dāng)我們啟動一個app的時候曼验,系統(tǒng)會創(chuàng)建一個進(jìn)程泌射,此進(jìn)程會加載一個Dalvik VM的實例,然后代碼就運行在DVM之上鬓照,類的加載和卸載熔酷,垃圾回收等事情都由DVM負(fù)責(zé)。也就是說在進(jìn)程啟動的時候豺裆,類被加載拒秘,靜態(tài)變量被分配內(nèi)存。
靜態(tài)變量在類被卸載的時候銷毀
類在什么時候被卸載留储?
在進(jìn)程結(jié)束的時候翼抠。
說明:一般情況下,所有的類都是默認(rèn)的ClassLoader加載的获讳,只要ClassLoader存在阴颖,類就不會被卸載,而默認(rèn)的ClassLoader生命周期是與進(jìn)程一致的丐膝,這里討論一般情況量愧。
Android中的進(jìn)程什么時候結(jié)束
這是Android對進(jìn)程和內(nèi)存管理不同于PC的核心——如果資源足夠,Android不會殺掉任何進(jìn)程帅矗,另一個意思就是進(jìn)程隨時可能會被殺掉偎肃。而Android會在資源夠的時候,重啟被殺掉的進(jìn)程浑此。也就是說靜態(tài)變量的值累颂,如果不做處理,是不可靠的,可以說內(nèi)存中的一切都不可靠紊馏。如果要可靠料饥,還是得保存到數(shù)據(jù)庫或文件中,在重啟的時候恢復(fù)回來朱监。
靜態(tài)引用的對象不會被垃圾回收
只要靜態(tài)變量沒有被銷毀也沒有置空岸啡,其對象一直被保持引用,也即引用計數(shù)不可能是0赫编,因此不會被垃圾回收巡蘸。因此,單例對象在運行時不會被回收擂送。