binder对象回收初探

Android之内存优化与OOM 内存知识,内存优化与OOM 阅读详情

binder回收初探

 

2018-9-27

IPackageDeleteObserver.Stub继承于Binder类,在应用中进行getPackageManager().deletePackage调用的时候,会传递一个Binder的回调对象给PMS(system_server)

       PackageDeleteObserver observer = new PackageDeleteObserver();

       getPackageManager().deletePackage("com.tencent.mm", observer, 0);

这个试验中,我们的每次点击按钮都会创建一个PackageDeleteObserver对象传给PMS,我们尝试多次点击按钮,new很多对象,看看是否会对系统构成攻击。

为了避免PackageDeleteObserver对象的释放,我们甚至采用ArrayList将其引用起来。

 

public class MainActivity extends Activity

implements OnClickListener {

 

       private static final String TAG = "MyService";

       private List<Object> mList = new ArrayList<Object> ();

    public class PackageDeleteObserver extends IPackageDeleteObserver.Stub { 

        public void packageDeleted(boolean succeeded) { 

            Log.i(TAG, "======= UNINSTALL_COMPLETE =========="); 

        }

        public void packageDeleted(String s, int i)

        {

              Log.i(TAG, "=======1 UNINSTALL_COMPLETE ==========");

        } 

    } 

      

       public void onClick(View src)

       {

              Log.i(TAG, "onClick: starting service");

             

              PackageDeleteObserver observer = new PackageDeleteObserver();

              mList.add(observer);

              getPackageManager().deletePackage("com.tencent.mm", observer, 0); 

 

Log.i(TAG, "List.size = " + mList.size());

             Log.i(TAG, "onClick: starting service, end of onClick");

       }

      

不断的点击按钮,同时,观察Local Binders的数量

Unknown:/ $ dumpsys meminfo 7365 | grep Binders

       Local Binders:       26        Proxy Binders:       15

Unknown:/ $ dumpsys meminfo 7365 | grep Binders

       Local Binders:       48        Proxy Binders:       15

Unknown:/ $ dumpsys meminfo 7365 | grep Binders

       Local Binders:       55        Proxy Binders:       15

Unknown:/ $ dumpsys meminfo 7365 | grep Binders

       Local Binders:       13        Proxy Binders:       15

 

结果发现,还是被释放了。

why?

 

打开JavaBBinder中的log来观察期创建和析构,

class JavaBBinder : public BBinder

{

public:

    JavaBBinder(JNIEnv* env, jobject object)

        : mVM(jnienv_to_javavm(env)), mObject(env->NewGlobalRef(object))

    {

        ALOGD("Creating JavaBBinder %p\n", this);

        android_atomic_inc(&gNumLocalRefs);

        incRefsCreated(env);

    }

 

    virtual ~JavaBBinder()

    {

        ALOGD("Destroying JavaBBinder %p\n", this);

        android_atomic_dec(&gNumLocalRefs);

        JNIEnv* env = javavm_to_jnienv(mVM);

        env->DeleteGlobalRef(mObject);

    }

 

结果发现,JavaBBinder对象确实是可以被释放的,

01-01 17:09:01.784  7365  7365 D JavaBinder: Creating JavaBBinder 0x74a3213080

01-01 17:09:13.376  7365  7378 D JavaBinder: Destroying JavaBBinder 0x74a3213080

 

查看Binder.java中的init方法

    private native final void init();

 

其实现在android_util_Binder.cpp中的

static void android_os_Binder_init(JNIEnv* env, jobject obj)

{

    JavaBBinderHolder* jbh = new JavaBBinderHolder();

    if (jbh == NULL) {

        jniThrowException(env, "java/lang/OutOfMemoryError", NULL);

        return;

    }

    ALOGV("Java Binder %p: acquiring first ref on holder %p", obj, jbh);

    jbh->incStrong((void*)android_os_Binder_init);

    env->SetLongField(obj, gBinderOffsets.mObject, (jlong)jbh);

}

 

可以看出,Binder对象关联的是JavaBBinderHolder,而不是JavaBBinder对象。

 

当调用端的BinderProxy对象释放的时候,server端的binder对象在没有被引用的情况下也会被释放。

 

Android Binder 进程间通信 Linux 中的系统内存可以分为两个不同的区域:内核空间和用户空间。内核空间是内核(即操作系统的核心)执行(即运行)并提供其服务的地方。内存由 RAM(随机存取存储器)单元组成,其内容可以以极高的速度访问(即读取和写入),但只能临时保留(即,在使用时或最多在电源保持开启时保留)。它的目的是保存当前正在使用的程序和数据,从而充当 CPU(中央处理器)和速度慢得多的存储之间的高速中介,后者通常由一个或多个硬盘驱动器 (HDD) 组成。用户空间是用户进程(即内核以外的所有内容)运行的内存位置的集合。 阅读详情

相关推荐

Binder常见面试题

Binder是一种通用的进程间通信机制,而AIDL更像是一种对Binder的封装,提供了更方便的开发方式。Binder的线程池由Binder驱动维护,用于处理不同进程间通信的请求。:Binder通信中的事务合并指的是将多个小的事务合并成一个大的事务一起发送,从而减少通信次数,提高效率。服务端通过Binder注册自己的对象(Binder对象),客户端通过Binder获取服务端的引用。:Binder驱动在处理通信时会引入一定的开销,通过优化Binder驱动的相关参数,如增大缓冲区大小等,可以减小通信开销。

呆木弱鸡 1036

Android内存泄漏简介

http://hubingforever.blog.163.com/blog/static/17104057920113297362974/ 前言    不少人认为JAVA程序,因为有垃圾回收机制,应该没有内存泄露。 其实如果我们一个程序中,已经不再使用某个对象,但是因为仍然有引用指向它,垃圾回收器就无法回收它,当然该对象占用的内存就无法被使用,这就造成了内存泄露。如果我们的ja

hjj0212的专栏 772

Android基础之Binder分析(2)

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套腾讯、字节跳动、阿里、百度2019-2021BAT 面试真题解析,我把大厂面试中常被问到的技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。还有 高级架构技术进阶脑图 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。Android 基础知识点Java 基础知识点Android 源码相关分析常见的一些原理性问题。

2401_84010497的博客 1108

如何解决Binder泄漏问题

作者:王小二C 2019/09/06前言[011]一个看似是系统问题的应用问题的解决过程[1]中我们解决了一个注册过多的BroadcastReceiver导致的某一次发...

嵌入式Linux 4223

【fwk基础】binder缓冲区精讲

在 Binder 驱动中,每个参与 Binder 通信的进程(无论是 client 还是 server)启动时,驱动会为它创建一个内核对象。唯一标识一个进程在 Binder 驱动中的实体(相当于“Binder 世界里的进程 PCB”)保存该进程的所有 Binder 相关资源:binder_node(该进程暴露给外部的 binder 对象)buffer 池(binder_alloc 结构管理)todo 队列(待处理事务)引用计数、锁等同步机制你可以理解。

疯子与天才就在一念之间 1234

Android 进阶——Binder IPC之Native 服务的启动及代理对象的获取详解(六)

Binder IPC之Native 服务的启动及代理对象的获取详解

最美不过,心中有梦,身旁有你! 1922

android内存泄漏简介

前言    不少人认为JAVA程序,因为有垃圾回收机制,应该没有内存泄露。 其实如果我们一个程序中,已经不再使用某个对象,但是因为仍然有引用指向它,垃圾回收器就无法回收它,当然该对象占用的内存就无法被使用,这就造成了内存泄露。如果我们的java运行很久,而这种内存泄露不断的发生,最后就没内存可用了。当然java的,内存泄漏和C/C++是不一样的。如果java程序完全结束后,它所有的对象就都不可

kent_kent_kent的专栏 930

Android 性能优化深水区:那些教科书上不会写的 Binder 调试与调优心法

我们修改 AIDL 接口,增加一个方法:

大模型大数据攻城狮的专栏 1364

binder native内存同步回收

通过扫描gcroot收集待回收的引用到referenceProcessor中的 cleared_references_变量中,其中就包括binder回收逻辑注册到的cleaner对象,最后通过referenceprocessor调用ReferenceQueue类的add方法,添加到回收链表中。当通过binder bp句柄初始化binder proxy的时候会通过注册native 回收函数,来关联java对象与native对象,当java对象被回收的时候会同步回收native对象。

congqingbin的专栏 412

IPackageDataObserver、IPackageDeleteObserver、IPackageInstallObserver

获取已安装app的应用信息,缓存大小,清除缓存,静默卸载,静默安装等,所需要的aidl文件,以及进程之间的通信。

智能电网中的智能调度与优化算法研究

本文研究智能电网中的智能调度与优化算法,旨在提高电网运行的效率与可靠性,减少能源浪费和设备故障的风险。在智能电网日益复杂化的背景下,传统的调度方法已难以满足高效、稳定的运行要求,因此亟需借助先进的优化算法对电网进行智能调度。本文第一深入分析智能电网调度中的关键问题与挑战,探讨优化算法在智能电网中的应用现状,并分析常见的优化算法,如遗传算法、粒子群算法和模拟退火算法。随后,本文构建智能电网的调度优化数学模型,并对电网负荷、发电模型及约束条件进行详细建模。在算法部分,本文提出改进的粒子群算法和遗传算法,并结合M

weixin_44553616的博客 1879

【fwk进阶】Binder死亡代理详解

我对这个远程 Binder 引用感兴趣,请在它死了的时候通知我”在 binder_ref 上挂 binder_ref_death。调用 DeathRecipient.binderDied()找到所有引用该node的binder_ref。唤醒Client线程处理work。这就是注册一个死亡代理。

疯子与天才就在一念之间 975

Saturn PCB Toolkit V8.02 实战:5分钟完成10A电源路径的走线与过孔通流验证

本文详细介绍了如何使用Saturn PCB Toolkit V8.02快速验证10A电源路径的走线与过孔通流能力。通过实战案例和参数配置指南,帮助工程师解决大电流PCB设计中的温升失控、过孔瓶颈等核心挑战,提升设计效率和可靠性。

weixin_34194829的博客 437

Binder 专题27——Binder 中的 Parcel 数据结构分析(Java)

本文分析了Android Binder机制中Parcel数据结构的Java层实现。Parcel作为Binder进程间通信的数据载体,支持基本数据类型、数组、Parcelable对象等多种数据格式。文章详细剖析了Parcel的初始化过程:通过obtain()方法从缓存池获取对象,若缓存不足则新建Parcel实例,其核心功能通过JNI调用Native层实现。同时介绍了recycle()回收机制,将使用完毕的Parcel对象重新放入缓存池以供复用。整体而言,Java层Parcel主要作为接口封装,实际数据处理由N

似霰的博客 1155

RustFS vs MinIO:深入对比分布式存储的性能、功能与选型指南

RustFS与MinIO是两款热门分布式存储系统,分别针对高性能与通用场景设计。RustFS基于Rust语言,在吞吐量(最高提升46%)、延迟(降低37%)和资源效率(内存占用减少67%)上显著优于MinIO,适合AI训练、金融级应用等高性能需求。MinIO凭借成熟的S3兼容性、云原生集成和企业级功能,更适用于混合云及现有S3生态。许可方面,RustFS采用Apache 2.0,MinIO为AGPLv3。选型建议:优先RustFS应对性能敏感场景,选择MinIO注重生态兼容性,也可考虑混合架构策略。

分布式存储与RustFS的博客 2019

用Isaac Sim复现经典案例:手把手教你写Python脚本控制机械臂抓取(附避障算法调试心得)

本文详细介绍了如何使用NVIDIA Isaac Sim仿真系统复现机械臂抓取经典案例,包括Python脚本编写、避障算法调试等关键步骤。通过URDF模型导入、关节控制逻辑实现和RMPFlow避障配置等实战演示,帮助开发者快速掌握机器人仿真技术,特别分享了官方文档未提及的实用调试技巧和性能优化策略。

weixin_30632089的博客 403

深度剖析Android Binder IPC机制

Binder是Android系统中的IPC机制,它允许不同进程之间进行高效、安全的通信。Binder基于客户端-

Android23333的博客 1116

大连理工大学中文情感词汇本体库(含情绪分析代码)

中文文本数据的情绪计算昨天如何对微博推文进行情绪分析(细粒度情感分析)介绍了英文的NRC情绪词典。虽然支持中文,但由于制作问题,导致并不完全适应中文场景。今天介绍大连理工大学中文情感...

大邓和他的Python 4万+

有关Android Binder面试,你未知的9个秘密

Android Binder作为Android系统中重要的进程间通信机制,在面试中常常成为检验面试者深度技术能力的重要考察点。希望通过本文能够帮助各位在面试中大放异彩。如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

star_nwe的博客 1220

告别配置噩梦:用Vcpkg三行命令为Easy3D自动安装Boost、CGAL和Qt(VS2022实测)

本文详细介绍了如何使用Vcpkg工具在VS2022环境下为Easy3D项目一键安装Boost、CGAL和Qt等依赖库,解决传统手动配置的复杂性问题。通过三行简单命令即可自动完成下载、编译和路径配置,大幅提升开发效率,特别适合C++开发者快速搭建3D图形开发环境。

weixin_42525582的博客 205

华为OD机试真题2026双机位C卷 C语言 实现【明日之星选举】

给定一组选票votes。votes[i]代表第 i 张选票的内容,包含一个字符串"zhangsan,hanmei",表示推荐zhangsan为明日之星,反对 hanmei 称为明日之星。赞成或反对使用逗号(,)分割。 给定一个数组n,表示最后将筛选出赞成票最多的n个人,如果赞成票相同,则反对票越少,排序越靠前;如果赞成票和反对票都相同,则按照姓名字典序升序排序。

MISAYAONE的博客 176

FrameWork学习总结之Binder

FrameWork学习总结

有所尝试,有所作为! 278

性能测试能力提升-线程、并发、吞吐量、TPS、QPS、响应时间

接着上一篇的知识:性能测试能力提升-关于性能测试,本篇文章,我们将主要介绍以下几方面的知识: 线程数&并发用户数 相对并发&绝对并发 吞吐量 TPS&QPS 响应时间

程序员小杨哥的博客 4581

Android的Binder小结

Server?????Server????Service?????????Client?????????Service Manager??????SM???????????Server???SM?????????? Client?????Client??Service????????????????SM???????????Client???????????? ?Client?

天行九歌 868

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

进程间通信机制Binder

binder 是什么? 进程间通信机制 也是一个驱动 Binder.java --> 实现 Ibinder — 跨进程的能力 什么时候用到多进程? 自己创建的进程:webVIew 视频播放、音乐、大图浏览、推送 系统服务:打电话,闹钟等等 多进程优点在哪里? 内存 : 一个app ,6G,8G,16G (使用更多) 风险隔离 : 每一个进程,单独的一个app Linux进程间通信机制有哪些? 管道、信号量、socket 、共享内存等等 Android为什么要增加Binder? Bind

puppy的博客 607

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

上一篇: BinderProxy如何复用的
下一篇: 弹出SD卡导致的重启问题分析
aaajj
博客等级 码龄19年 558粉丝 542原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值