偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Android垃圾回收實(shí)質(zhì)內(nèi)容解析

移動(dòng)開發(fā) Android
Android垃圾回收的實(shí)現(xiàn)其實(shí)可以看做是對(duì)sp以及wp的操作。我們將會(huì)在這篇文章中對(duì)這兩種操作分別做一詳細(xì)介紹。讓大家充分掌握這一方面的知識(shí)。

Android手機(jī)操作系統(tǒng)中的代碼編寫方式對(duì)于有基礎(chǔ)的編程人員來說是比較容易的。因?yàn)樗腔贚inux平臺(tái)的操作系統(tǒng)。我們在這里為大家介紹的是Android垃圾回收這一機(jī)制,以加深大家對(duì)這一系統(tǒng)的了解。#t#

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

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

首先我們看sp,sp實(shí)際上不是smart pointer的縮寫,而是strong pointer,它實(shí)際上內(nèi)部就包含了一個(gè)指向?qū)ο蟮闹羔樁?。我們可以簡單看看sp的一個(gè)構(gòu)造函數(shù):

  1. template< typename T> 
  2. sp< T>::sp(T* other)  
  3. : m_ptr(other)  
  4. {  
  5. if (other) other->incStrong(this);  

比如說我們聲明一個(gè)對(duì)象:

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

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

  1. template< typename T> 
  2. sp< T>::~sp()  
  3. {  
  4. if (m_ptr) m_ptr->decStrong(this);  

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

  1. wp< T>::wp(T* other)  
  2. : m_ptr(other)  
  3. {  
  4. if (other) m_refs = other->createWeak(this);  

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

  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. {  

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

  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()); //強(qiáng)引用加1  
  12. singleton = hardware;//弱引用加1  
  13. return hardware;//賦值構(gòu)造函數(shù),強(qiáng)引用加1  
  14. }  
  15. //hardware被刪除,強(qiáng)引用減1  

Android垃圾回收的相關(guān)內(nèi)容就為大家介紹到這里。

責(zé)任編輯:曹凱 來源: CSDN
相關(guān)推薦

2010-10-13 10:24:38

垃圾回收機(jī)制JVMJava

2021-01-04 10:08:07

垃圾回收Java虛擬機(jī)

2017-08-04 10:53:30

回收算法JVM垃圾回收器

2022-01-20 10:34:49

JVM垃圾回收算法

2022-03-21 11:33:11

JVM垃圾回收器垃圾回收算法

2010-09-27 09:01:26

JVM分代垃圾回收

2010-02-24 15:28:59

WCF ABC

2021-11-05 15:23:20

JVM回收算法

2010-03-02 16:28:11

WCF發(fā)布訂閱

2020-07-09 08:26:42

Kubernetes容器開發(fā)

2009-06-25 17:48:24

Java垃圾回收

2021-03-03 08:13:57

模式垃圾回收

2023-12-19 21:52:51

Go垃圾回收開發(fā)

2010-12-13 11:14:04

Java垃圾回收算法

2023-08-08 10:29:55

JVM優(yōu)化垃圾回收

2017-02-21 16:40:16

Android垃圾回收內(nèi)存泄露

2025-05-16 08:00:00

2010-02-25 09:36:28

WCF行為控制

2022-06-22 09:54:45

JVM垃圾回收Java

2009-08-21 17:31:58

C#垃圾回收
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)