android - Android Binders 的内存开销

标签 android performance ipc

虽然我对 Binder 用于跨进程通信的进程有些熟悉,但我想知道它们必须与内核上的 Binder 驱动程序交互这一事实是否显着增加了创建对象的内存开销。

此外,即使交易数量没有增加,创建大量 Binder 是否会限制现有 Binder 的交易速度?

最佳答案

您必须深入研究 libbinder 代码以及内核驱动程序代码才能真正分析内存消耗。然而,开销可能不是很多,因为在内部绑定(bind)驱动程序有它的驱动程序对象,然后链接到调用进程拥有的实际绑定(bind)程序。它还限制了调用进程可以用来处理同时事务的线程数。

就性能而言,主要限制因素将是通过给定 Binder 的交易数据的大小。每个 Binder 都有一个固定大小的缓冲区 (1MB) 来处理该 Binder 的所有事务。因此,如果针对特定 Binder 同时进行多个事务,则所有事务使用的总数据将计入此限制。由于发生的异常(Java 级别)不会指示它是事务的发送 部分还是接收 部分,因此要排除故障或妥善处理这可能非常棘手。经验法则是,通过 Binder 移动的数据需要很小,就像消息传递一样。它不太适合流数据之类的东西。 Android 使用 ashmem 驱动程序支持来更好地处理此问题以及跨绑定(bind)器共享文件描述符的能力。

Binder 本身在 btree 中进行跟踪,因此查找应该非常快。对于给定的进程以及系统中的 Binder 总数是否达到高水平,如果有一些关于此的统计数据会很有趣,但我不知道有任何此类数据。

关于android - Android Binders 的内存开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39581915/

相关文章:

node.js - Electron - IPC改变对象

android - 在 Google Maps API v2 Android 中添加多个标记

android - 如何检查 Android 应用程序是否由用户或其他应用程序启动

android - 我可以在不使用 RemoteMediaPlayer.load 的情况下更改 chromecast 风格的媒体接收器上的专辑封面吗?

C++ 坏内存分配异常

c++ - 在 Linux 中对只读文件设置排他锁

android - 如何在 onResume() 中检索 onSaveInstanceState() 包?

c - 如何查看内存带宽是否已经成为瓶颈?

C++ 高效查找 vector 中第一个最接近的匹配值?

c# - 如何从 .NET 4.0 (VS2010) 项目中定位 .NET 1.1 中的 API?