我想我找到了一个内存泄漏问题,并希望确认我对Android的Binder实现的看法是否正确。在这种情况下,我有一个服务和一个活动,每个进程都有一个。我创建了一个AIDL,允许我通过ipc方法将回调对象从活动传递到服务,然后在服务完成所请求的任务时调用回调。
很长一段时间以来,我一直在想:如果我将一个新的回调对象传递给服务,并且我不在我的活动中保留指向回调对象的指针,为什么垃圾收集器不会收集我的活动进程中的回调?由于似乎没有发生这种情况,JVM如何知道何时收集我的活动中的回调?
我认为答案是Binder系统在活动进程中保留对我的回调的指针,直到相应的服务进程中的回调对象调用其finalize()方法,然后发送消息到活动中释放该指针。这是正确的吗?如果不是,它是如何工作的? 我相信这是正确的,这导致了一个有趣的情况,如果活动中的回调指向非常占用内存的内容,则在服务中的回调被收集之前,它将不会被收集。如果服务的内存不够低,它可能很长时间不会收集回调,而回调可能会在活动中积累,直到活动发生OutOfMemoryError。
很长一段时间以来,我一直在想:如果我将一个新的回调对象传递给服务,并且我不在我的活动中保留指向回调对象的指针,为什么垃圾收集器不会收集我的活动进程中的回调?由于似乎没有发生这种情况,JVM如何知道何时收集我的活动中的回调?
我认为答案是Binder系统在活动进程中保留对我的回调的指针,直到相应的服务进程中的回调对象调用其finalize()方法,然后发送消息到活动中释放该指针。这是正确的吗?如果不是,它是如何工作的? 我相信这是正确的,这导致了一个有趣的情况,如果活动中的回调指向非常占用内存的内容,则在服务中的回调被收集之前,它将不会被收集。如果服务的内存不够低,它可能很长时间不会收集回调,而回调可能会在活动中积累,直到活动发生OutOfMemoryError。