溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Android中怎么實現(xiàn)垃圾回收

發(fā)布時間:2021-06-26 14:59:43 來源:億速云 閱讀:103 作者:Leah 欄目:移動開發(fā)

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)Android中怎么實現(xiàn)垃圾回收,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

首先所有的類都會虛繼承refbase類,因為它實現(xiàn)了達到Android垃圾回收所需要的所有function,因此實際上所有的對象聲明出來以后都具備了自動釋放自己的能力,也就是說實際上智能指針就是我們的對象本身,它會維持一個對本身強引用和弱引用的計數(shù),一旦強引用計數(shù)為0它就會釋放掉自己。

首先我們看sp,sp實際上不是smart pointer的縮寫,而是strong pointer,它實際上內(nèi)部就包含了一個指向?qū)ο蟮闹羔樁选N覀兛梢院唵慰纯磗p的一個構(gòu)造函數(shù):

template< typename T> sp< T>::sp(T* other)  : m_ptr(other)  {  if (other) other->incStrong(this);  }

比如說我們聲明一個對象:

sp< CameraHardwareInterface> hardware(new CameraHal());

實際上sp指針對本身沒有進行什么操作,就是一個指針的賦值,包含了一個指向?qū)ο蟮闹羔?,但是對象會對對象本身增加一個強引用計數(shù),這個 incStrong的實現(xiàn)就在refbase類里面。新new出來一個CameraHal對象,將它的值給 sp< CameraHardwareInterface>的時候,它的強引用計數(shù)就會從0變?yōu)?。因此每次將對象賦值給一個sp指針的時候,對象的強引用計數(shù)都會加1,下面我們再看看sp的析構(gòu)函數(shù):

template< typename T> sp< T>::~sp()  {  if (m_ptr) m_ptr->decStrong(this);  }

實際上每次delete一個sp對象的時候,sp指針指向的對象的強引用計數(shù)就會減一,當(dāng)對象的強引用技術(shù) 為0的時候這個對象就會被自動釋放掉。
我們再看wp,wp就是weak pointer的縮寫,弱引用指針的原理 ,就是為了應(yīng)用Android垃圾回收來減少對那些胖子對象對內(nèi)存的占用,我們首先來看wp的一個構(gòu)造函數(shù):

wp< T>::wp(T* other)  : m_ptr(other)  {  if (other) m_refs = other->createWeak(this);  }

它和sp一樣實際上也就是僅僅對指針進行了賦值而已,對象本身會增加一個對自身的弱引用計數(shù),同時wp還包含一個m_ref指針,這個指針主要是用來將wp升級為sp時候使用的:

template< typename T> sp< T> wp< T>::promote() const  {  return sp< T>(m_ptr, m_refs);  }  template< typename T> sp< T>::sp(T* p, weakref_type* refs)  : m_ptr((p && refs->attemptIncStrong(this)) ? p : 0)  {  }

實際上我們對wp指針***能做的就是將wp指針升級為一個sp指針,然后判斷是否升級成功,如果成功說明對象依舊存在,如果失敗說明對象已經(jīng)被釋放掉了。wp指針我現(xiàn)在看到的是在單例中使用很多,確保mhardware對象只有一個,比如:

wp< CameraHardwareInterface> CameraHardwareStub::singleton;  sp< CameraHardwareInterface> CameraHal::createInstance()  {  LOG_FUNCTION_NAME  if (singleton != 0) {  sp< CameraHardwareInterface> hardware = singleton.promote();  if (hardware != 0) {  return hardware;  }  }  sp< CameraHardwareInterface> hardware(new CameraHal()); //強引用加1  singleton = hardware;//弱引用加1  return hardware;//賦值構(gòu)造函數(shù),強引用加1  }  //hardware被刪除,強引用減1

上述就是小編為大家分享的Android中怎么實現(xiàn)垃圾回收了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI