私はメモリリークを追跡し、Androidのバインダーがどのように実装されているかについて私が真実だと思うことを確認したいと思います。この場合、それぞれ独自のプロセスでサービスとアクティビティがあります。ipcメソッドを介してアクティビティからサービスにコールバックオブジェクトを渡し、要求されたタスクでサービスが完了したときにコールバックを呼び出すことができるAIDLを作成しました。
長い間、私は疑問に思っていました。新しいコールバックオブジェクトをサービスに渡し、アクティビティにコールバックオブジェクトへのポインターを保持しない場合、ガベージコレクターが先に進んでアクティビティにコールバックを収集しないのはなぜですか。処理する?それは起こらないように思われるので、JVMは、アクティビティでコールバックをガベージコレクションするタイミングをどのように知るのでしょうか。
答えは、BinderシステムがActivityプロセスのCallbackへのポインターを保持し、Serviceプロセスの対応するCallbackオブジェクトがfinalize()メソッドを呼び出すまで、ポインターを解放するメッセージをActivityに送信することだと思います。これは正しいです?そうでない場合、それはどのように機能しますか?
私はそうだと信じており、アクティビティのコールバックが非常にメモリを大量に消費するものを指している場合、サービスのコールバックが収集されるまで収集されないという興味深い状況につながります。サービスのメモリが不足していない場合、コールバックが長期間収集されず、アクティビティにOutOfMemoryErrorが発生するまでコールバックがアクティビティに蓄積される可能性があります。