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