LoginSignup
0
0

More than 1 year has passed since last update.

Effective Java(第3版) 項目7 使われなくなったオブジェクト参照を取り除く

Posted at

使われなくなった参照を保持しないように注意し、メモリリークが発生しないようにする、という内容です。

記載内容

クラスが独自のメモリ管理を行う場合

コード例のスタックのように、クラスが独自のメモリ管理を行う場合はメモリリークに注意する必要が有る。
具体的には、使われなくなった参照にnullを設定することで、不要な参照を取り除けば良い。
ただし、このnullの設定は、不要にコードを乱雑にするため、常に行うべきではない。
(スコープの終了で解放される変数に対して、nullを設定するようなことはするべきではない)

キャッシュ

オブジェクト参照をキャッシュに入れると、そこにオブジェクト参照が存在することを忘れることが多く、
キャッシュした参照が不要になっても、キャッシュ内に残ったままにしてしまうことが多い。
一般的な対処法として、以下がある。

  • WeakHashMap(キーへの参照が無くなった場合に、キャッシュされた値が不要になる場合に有効)
  • 古いキャッシュのバックグラウンド(ScheduledThreadPoolExecutor等)での除去
  • 直接java.lang.refを使用する(高度なキャッシュ処理が必要な場合)

リスナー、コールバック

コールバックを登録可能だが、明示的な解除をAPIとして提供していない場合、コールバックが蓄積し、メモリリークとなる。
対処方法として、コールバックに対して、弱い参照だけを保持する方法がある。

考察

メモリリークを避けるのは当然ですが、油断するとメモリリークしてしまう、ということは良くあると思います。

特に、クラス内でコレクションによる参照の保持することで、意図せずメモリ管理を行っていることが有ります。
その場合、その参照が増え続けないか、明示的な除去が必要かは、よく考える必要が有ります。
ただ、プログラムの稼働時間が長くなると問題が出る場合もあり、注意が必要かと思います。

メモリリークが発生した場合、プロファイラでの調査等、手間がかかりますので、
実装時に注意しておくべきです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0