コンピュータプログラミングにおいて、リスナーの失効問題はオブジェクト指向プログラミング言語のメモリリークの一般的な原因であり、ガベージコレクション言語では最も一般的な原因の1つです。[1]
これはオブザーバーパターンに由来します。オブザーバーパターンでは、オブザーバー(またはリスナー)がイベントを受信するためにサブジェクト(またはパブリッシャー)に登録します。基本的な実装では、サブジェクトがオブザーバーへの強い参照を保持し、オブザーバーを生存させ続けるため、ディスポーズパターンと同様に、明示的な登録と登録解除の両方が必要になります。リークは、オブザーバーがリッスンする必要がなくなったときにサブジェクトからの登録解除に失敗すると発生します。その結果、サブジェクトはオブザーバーへの参照を保持し続け、サブジェクトが生存する限り、つまりアプリケーションの終了まで、オブザーバーが参照している他のすべてのオブジェクトを含め、オブザーバーがガベージコレクションされるのを妨げます。
これはメモリリークだけでなく、「無関係な」オブザーバーが不要なイベントを受信して処理することでパフォーマンスの低下を引き起こします。これは、サブジェクトがオブザーバーへの弱参照を保持することで防ぐことができ、オブザーバーを登録解除することなく通常通りガベージコレクションできます。
参考文献
- ^ Javaの記憶の徘徊者、イーサン・ヘンリーとエド・リクラマ