Creo que he rastreado una pérdida de memoria y quiero confirmar lo que creo que puede ser cierto acerca de cómo se implementa Binder de Android. En este caso, tengo un Servicio y una Actividad, cada uno en su propio proceso. Creé un AIDL que me permite pasar un objeto de devolución de llamada de la actividad al servicio a través de un método ipc y luego llamar cuando se realiza el servicio con la tarea solicitada.Carpeta de prevención de la recolección de basura
Durante mucho tiempo me he estado preguntando: si paso un nuevo objeto de devolución de llamada al servicio y no guardo un puntero al objeto de devolución de llamada en mi actividad ¿por qué el recolector de basura no sigue adelante y recoge la devolución de llamada en mi proceso de actividad? Dado que eso no parece suceder, ¿cómo sabe la JVM cuándo recolectar basura la devolución de llamada en mi actividad?
Creo que la respuesta es que el sistema Binder mantiene un puntero a mi devolución de llamada en el proceso de actividad hasta que el objeto callback correspondiente en el proceso de servicio tiene su método finalize() llamado, que envía un mensaje a la actividad para liberar el puntero. ¿Es esto correcto? Si no, ¿cómo funciona?
Creo que es así y conduce a una situación interesante en la que si la Devolución de llamada en la actividad apunta hacia algo con mucha memoria no se recogerá hasta que se recupere la devolución de llamada en el servicio. Si el servicio no tiene poca memoria, es posible que no recopile la devolución de llamada durante un tiempo prolongado y las devoluciones de llamada se acumularán en la actividad hasta que exista un OutOfMemoryError en la actividad.