Android的垃圾回收机制(android refbase类(sp wp))

来源:互联网 发布:什么是淘宝c店 编辑:程序博客网 时间:2024/05/21 19:39

sp和wp的实现过程~~
        个人觉得sp和wp实际上就是android 为其c++实现的自动垃圾 回收机制 ,具体到内部实现,sp和wp实际上只是一个实现垃圾回收功能的接口 而已,比如说对*,->的重载,是为了其看起来跟真正的指针一样,而真正实现垃圾回收的是refbase这个基类。这部分代码的目录 在:/frameworks/base/include/utils/RefBase.h
        首先所有的类都会虚继承refbase类,因为它实现了达到垃圾回收所需要的所有function,因此实际上所有的对象声明出来以后都具备了自动 释放自己的能力,也就是说实际上智能指针就是我们的对象本身,它会维持一个对本身强引用和弱引用的计数,一旦强引用计数为0它就会释放掉自己。
       首先我们看sp,sp实际上不是smart pointer的缩写,而是strong pointer,它实际上内部就包含了一个指向对象的指针而已。我们可以简单看看sp的一个构造函数:
template
sp::sp(T* other)
    : m_ptr(other)
{
    if (other) other->incStrong(this);
}
比如说我们声明一个对象:
sp hardware(new CameraHal());
实际上sp指针对本身没有进行什么操作,就是一个指针的赋值,包含了一个指向对象的指针,但是对象会对对象本身增加一个强引用计数,这个 incStrong的实现就在refbase类里面。新new出来一个CameraHal对象,将它的值给 sp的时候,它的强引用计数就会从0变为1。因此每次将对象赋值给一个sp指针的时候, 对象的强引用计数都会加1,下面我们再看看sp的析构函数:
template
sp::~sp()
{
    if (m_ptr) m_ptr->decStrong(this);
}
实际上每次delete一个sp对象的时候,sp指针指向的对象的强引用计数就会减一,当对象的强引用技术 为0的时候这个对象就会被自动释放掉。
      wp就是weak pointer的缩写,wp 这个指针类,实际上他是一个弱引用类型的指针类,弱引用是在.net 以及java 中经常用到的,弱引用是一个对象引用的持有者,使用弱引用后可以维持对对象的引用,但是不会阻止其被垃圾回收。如果一个对象只有弱引用了,那它就成为被垃圾回收的候选对象,就像没有剩余的引用一样,而且一旦对象被删除,所有的弱引用也会被清楚。弱引用适合那些数据 成员特别多,而且重新创建又相对容易的类,也就是俗称的胖子类,建立弱引用可以引用对象,但也不阻止其被垃圾回收,在内存的使用方面取得一定的平衡。

在android 中wp 类里面的promote 函数实际上就是将一个弱引用升级为一个强引用。不管是sp 还是wp ,实际上都是android 利用现有的c++ 特性来解决内存使用和回收的一种手段。

,就是为了减少对那些胖子对象对内存的占用,我们首先来看wp的一个构造函数:
wp::wp(T* other)
    : m_ptr(other)
{
    if (other) m_refs = other->createWeak(this);
}
它和sp一样实际上也就是仅仅对指针进行了赋值而已,对象本身会增加一个对自身的弱引用计数,同时wp还包含一个m_ref指针,这个指针主要是用来将wp升级为sp时候使用的:
template
sp wp::promote() const
{
    return sp(m_ptr, m_refs);
}
template
sp::sp(T* p, weakref_type* refs)
    : m_ptr((p && refs->attemptIncStrong(this)) ? p : 0)
{
}
实际上我们对wp指针唯一能做的就是将wp指针升级为一个sp指针,然后判断是否升级成功,如果成功说明对象依旧存在,如果失败说明对象已经被释放掉了。wp指针我现在看到的是在单例中使用很多,确保mhardware对象只有一个,比如:
wp CameraHardwareStub::singleton;
sp CameraHal::createInstance()
{
    LOG_FUNCTION_NAME
    if (singleton != 0) {
        sp hardware = singleton.promote();
        if (hardware != 0) {
            return hardware;
        }
    }
    sp hardware(new CameraHal());   //强引用加1
    singleton = hardware;//弱引用加1
    return hardware;//赋值构造函数,强引用加1
}
//hardware被删除,强引用减1

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 华为商城不小心点了确认收货怎么办 买的认证服务号没有微信支付怎么办 手机微信里的外网链接打不开怎么办 微信违规无法加入群聊怎么办 苹果手机微信储存空间不足怎么办 拼多多砍价砍不到0元怎么办 妻子婚内出轨我的熟人怎么办 父亲怀疑母亲有外遇作为儿子怎么办 老婆出轨我总心理过不去坎该怎么办 失业人员离培训机构远了怎么办 遇到申请假冒商品的仅退款怎么办 微信被骗什么消息都不知道怎么办 微信用手机登录显示未注册怎么办 唯品会海淘订单取消不了怎么办 大排量摩托芯片钥匙断了怎么办 夏天太热在宿舍没空调怎么办? 汽车钥匙掉了怎么办半路到不了家 当顾客说产品太贵的时候 怎么办 邮件还没有下载被发送者删除怎么办 绝地求生号被盗了怎么办邮箱没有用 暴雪忘了密码换了手机号怎么办 华为荣耀10看电视缓冲太慢怎么办 交易猫梦幻西游手游恶意仲裁怎么办 银色高跟鞋前面尖尖蹭掉色了怎么办 苹果账号邮箱和密码都忘了怎么办 网易云密码忘记了怎么办手机号换了 超市买过期东西但没有小票怎么办 网购退货商家已收货而不退款怎么办 手机号被别人注册了京东怎么办 中通快递把我发的货弄坏了了怎么办 在淘宝获取不了丰巢柜提货码怎么办 京东快递提货码数手机号错了怎么办 腾讯手游助手不能玩刺激战场怎么办 刚收的京东快递质量有问题怎么办 拼多多买家接受信息没有声音怎么办 苹果6s外放声音有杂音怎么办 华为手机不小心把视频删了怎么办 电脑做完系统不显示声卡了怎么办 苹果手机自带浏览器看视频卡怎么办 pr剪辑的时候视频太卡怎么办 小米手机忘记登录账号密码了怎么办