強引用、軟引用、弱引用、虛引用詳解
先說一下垃圾回收機制GabageCollection:
GC是垃圾收集的意思(GabageCollection)。和JAVA一樣,ANDROID系統也是由GC來自動回收記憶體的。android中一個應用的啟動,android系統都會為這個應用分配一個dalivk虛擬機器,以便這個應用執行在這個獨立的虛擬機器上,可是一個虛擬機器記憶體大小一般也是限制的(20M左右)。可見,一個應用的執行所申請的記憶體不可能無限大的。
通常,GC是在一個單獨的比較低優先 級執行緒中執行。這樣其記憶體的釋放就交給了GC來處理,GC會實時監測並釋放“無效”的記憶體。這裡關鍵字“無效”就引起了我們的注意,什麼記憶體單元是無效的呢?一般GC採用的辦法是引用計數法來判斷一個記憶體單元(一個變數)是否是無效的記憶體,其實很多系統都採用了這種辦法,比如Cocos2D這個遊戲開發的引擎也採用了這種引用計數法。引用計數法簡單的說就是指一個變數或是一塊記憶體當前被引用的次數,如果引用的次數等於0,則可以表示這個變數或是這塊記憶體沒有被引用了,那麼GC“很可能”就會去釋放他了。這裡要提一下:“很可能”呢?我覺得這是最貼近實時的,首先GC執行在一個優先順序較低的執行緒;其次GC回收的具體工作也是相當複雜的(這裡要注意:引用計數法只是GC中的一個常用的方法,GC對記憶體管理的方法都很複雜,比如還會用到年代方法等,自己可以去研究研究),比如同時需要釋放大量記憶體時候,並且CPU資源有相對很緊張,GC可能就會選擇性的釋放一些記憶體資源。那我們做android開發時候,就需要特別注意記憶體的引用,比如一個佔用記憶體大的物件、以及一個bitmap物件,他們往往無用、又佔用大量記憶體資源而GC又沒有辦法去釋放,從而造成嚴重後果。一般的原則是:對佔用大量記憶體的變數,使用完後主動將其置為NULL,可能的話主動呼叫一次GC:system.gc(),特別是一些static型的引用風險很大。
明白了GC以及引用計數法,下面來說一下幾種引用: