Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 開發入門 >> Android垃圾回收實質內容解析

Android垃圾回收實質內容解析

編輯:開發入門

Android手機操作系統中的代碼編寫方式對於有基礎的編程人員來說是比較容易的。因為它是基於Linux平台的操作系統。我們在這裡為大家介紹的是android垃圾回收這一機制,以加深大家對這一系統的了解。

  個人覺得sp和wp實際上就是android 為其c++實現的自動垃圾 回收機制 ,具體到內部實現,sp和wp實際上只是一個實現垃圾回收功能的接口而已,比如說對*,->的重載,是為了其看起來跟真正的指針一樣,而真正實現垃圾回收的是refbase這個基類。這部分代碼的目錄在:/frameworks/base/include/utils/RefBase.h

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

  首先我們看sp,sp實際上不是smart pointer的縮寫,而是strong pointer,它實際上內部就包含了一個指向對象的指針而已。我們可以簡單看看sp的一個構造函數:

  1.template< typename T>

  2.sp< T>::sp(T* other)

  3.: m_ptr(other)

  4.{

  5.if (other) other->incStrong(this);

  6.}

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

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

  實際上sp指針對本身沒有進行什麼操作,就是一個指針的賦值,包含了一個指向對象的指針,但是對象會對對象本身增加一個強引用計數,這個 incStrong的實現就在refbase類裡面。新new出來一個CameraHal對象,將它的值給 sp< CameraHardwareInterface>的時候,它的強引用計數就會從0變為1。因此每次將對象賦值給一個sp指針的時候,對象的強引用計數都會加1,下面我們再看看sp的析構函數:

  1.template< typename T>

  2.sp< T>::~sp()

  3.{

  4.if (m_ptr) m_ptr->decStrong(this);

  5.}

  實際上每次delete一個sp對象的時候,sp指針指向的對象的強引用計數就會減一,當對象的強引用技術 為0的時候這個對象就會被自動釋放掉。

  我們再看wp,wp就是weak pointer的縮寫,弱引用指針的原理 ,就是為了應用android垃圾回收來減少對那些胖子對象對內存的占用,我們首先來看wp的一個構造函數:

  1.wp< T>::wp(T* other)

  2.: m_ptr(other)

  3.{

  4.if (other) m_refs = other->createWeak(this);

  5.}

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

  1.template< typename T>

  2.sp< T> wp< T>::promote() const

  3.{

  4.return sp< T>(m_ptr, m_refs);

  5.}

  6.template< typename T>

  7.sp< T>::sp(T* p, weakref_type* refs)

  8.: m_ptr((p && refs->attemptIncStrong(this)) ? p : 0)

  9.{

  10.}

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

  1.wp< CameraHardwareInterface> CameraHardwareStub::singleton;

  2.sp< CameraHardwareInterface> CameraHal::createInstance()

  3.{

  4.LOG_FUNCTION_NAME

  5.if (singleton != 0) {

  6.sp< CameraHardwareInterface> hardware = singleton.promote();

  7.if (hardware != 0) {

  8.return hardware;

  9.}

  10.}

  11.sp< CameraHardwareInterface> hardware(new CameraHal()); //強引用加1

  12.singleton = hardware;//弱引用加1

  13.return hardware;//賦值構造函數,強引用加1

  14.}

  15.//hardware被刪除,強引用減1

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved