【发布时间】:2011-12-20 01:14:10
【问题描述】:
我想我找到了内存泄漏,并想确认我认为 Android 的 Binder 是如何实现的。在这种情况下,我有一个服务和一个活动,每个都在自己的进程中。我创建了一个 AIDL,它允许我通过 ipc 方法将回调对象从 Activity 传递给 Service,然后在 Service 完成请求的任务时调用回调。
很长一段时间我都在想:如果我将一个新的回调对象传递给服务并且我没有在我的活动中保留指向回调对象的指针为什么垃圾收集器不继续前进在我的 Activity 进程中收集回调? 既然这似乎没有发生,那么 JVM 怎么知道何时在我的 Activity 中垃圾收集回调。
我想答案是Binder系统在Activity进程中保存一个指向我的Callback的指针,直到Service进程中对应的Callback对象调用了它的finalize()方法,然后给Activity发送消息释放指针。 这是正确的吗?如果不是,它是如何工作的?
我相信它会导致有趣的情况,如果 Activity 中的回调指向内存密集型的东西,则在收集服务中的回调之前不会收集它。如果 Service 的内存不低,它可能很长一段时间都不会收集回调,回调可能只是在 Activity 中建立,直到 Activity 中出现 OutOfMemoryError。
【问题讨论】:
标签: android ipc android-binder