使われなくなった参照を保持しないように注意し、メモリリークが発生しないようにする、という内容です。
記載内容
クラスが独自のメモリ管理を行う場合
コード例のスタックのように、クラスが独自のメモリ管理を行う場合はメモリリークに注意する必要が有る。
具体的には、使われなくなった参照にnullを設定することで、不要な参照を取り除けば良い。
ただし、このnullの設定は、不要にコードを乱雑にするため、常に行うべきではない。
(スコープの終了で解放される変数に対して、nullを設定するようなことはするべきではない)
キャッシュ
オブジェクト参照をキャッシュに入れると、そこにオブジェクト参照が存在することを忘れることが多く、
キャッシュした参照が不要になっても、キャッシュ内に残ったままにしてしまうことが多い。
一般的な対処法として、以下がある。
- WeakHashMap(キーへの参照が無くなった場合に、キャッシュされた値が不要になる場合に有効)
- 古いキャッシュのバックグラウンド(ScheduledThreadPoolExecutor等)での除去
- 直接java.lang.refを使用する(高度なキャッシュ処理が必要な場合)
リスナー、コールバック
コールバックを登録可能だが、明示的な解除をAPIとして提供していない場合、コールバックが蓄積し、メモリリークとなる。
対処方法として、コールバックに対して、弱い参照だけを保持する方法がある。
考察
メモリリークを避けるのは当然ですが、油断するとメモリリークしてしまう、ということは良くあると思います。
特に、クラス内でコレクションによる参照の保持することで、意図せずメモリ管理を行っていることが有ります。
その場合、その参照が増え続けないか、明示的な除去が必要かは、よく考える必要が有ります。
ただ、プログラムの稼働時間が長くなると問題が出る場合もあり、注意が必要かと思います。
メモリリークが発生した場合、プロファイラでの調査等、手間がかかりますので、
実装時に注意しておくべきです。