Binder предотвращает сборку мусора

Думаю, я обнаружил утечку памяти и хочу подтвердить, что, по моему мнению, может быть правдой о том, как реализован Android Binder. В этом случае у меня есть сервис и действие, каждое в своем процессе. Я создал AIDL, который позволяет мне передавать объект обратного вызова из Activity в службу через метод ipc, а затем вызывать обратный вызов, когда служба выполняет запрошенную задачу.

Долгое время я задавался вопросом: если я передаю новый объект обратного вызова Службе и не сохраняю указатель на объект обратного вызова в своей деятельности , почему бы сборщику мусора просто не продолжить и собирать обратный вызов в моем процессе Activity? Поскольку этого, похоже, не происходит, как JVM узнает, когда собирать мусор для обратного вызова в моем Activity.

Я думаю, что ответ заключается в том, что система Binder сохраняет указатель на мой обратный вызов в процессе Activity до тех пор, пока соответствующий объект обратного вызова в процессе Service не вызовет свой метод finalize (), который затем отправит сообщение Activity, чтобы освободить указатель. Это правильно? Если нет, то как это работает?

Я считаю, что это так, и это приводит к интересной ситуации, когда, если обратный вызов в действии указывает на что-то очень интенсивное по памяти, он не будет собран до тех пор, пока не будет собран обратный вызов в службе.Если службе не хватает памяти, она может не собирать обратный вызов в течение длительного времени, а обратные вызовы могут просто накапливаться в действии, пока в действии не появится OutOfMemoryError.

5
задан Onik 27 March 2018 в 20:23
поделиться