このページをはてなブックマークに追加このページを含むはてなブックマーク このページをlivedoor クリップに追加このページを含むlivedoor クリップ

目次

ガベージコレクションの対象

  • どこからも参照されなくなった、オブジェクトが占有しているメモリ領域を開放して再利用すること。
  • ガベージコレクタという機能により実現される。
  • ガベージコレクションが行われている間は、プログラムの動作が中断する。
  • 強い参照の経路がルートセットからあるオブジェクトまで辿れなくなると、そのオブジェクトはガベージコレクションの対象となる。
  • オブジェクトがどの強い参照からも参照されなくなり、弱い参照だけが残っている状態になるとガベージコレクションの対象となる。
  • 別のヒープブロックを割り当てる前に、仮想マシンはすべての弱い参照を削除することでメモリをクリアしようとし、それでも要求された新しい割り当てを行うためのメモリ領域を確保できない場合は仮想マシンはソフト参照を削除する。
  • ガベージコレクタというプログラムがガベージコレクションを実行する。
    • 独立したスレッドとして動作する。
    • 定期的にヒープ領域の状態を調べ、空きメモリ領域が少なくなったことを検知すると実際のガベージコレクション処理を起動する。
  • 孤立したインスタンスを不要なインスタンスとしてみなし、このインスタンスが削除対象となる。
  • OOPで書かれたアプリケーションではたくさんのインスタンスが作られるが、それらが参照しあって全体としてネットワークを構成する。
  • このインスタンスのネットワークはヒープ領域だけの話ではなく、残りの2つのメモリ領域であるスタックやメソッドエリアもかかわる。
    • スタックには実行中のメソッドの引数やローカル変数が格納されており、OOPでは引数やローカル変数にインスタンスを指定することができる。つまり、OOPではスタックにヒープ領域に存在するインスタンスのポインタ格納される。
    • メソッドエリアからもヒープ領域のインスタンスも参照できる。
      • Javaではクラス変数がそれに相当する。
    • スタックとメソッドエリアはアプリケーションの処理で必要な情報を持つため、ここから参照されているインスタンスはガベージコレクションの対象にならない。
      • スタックとメソッドエリアが矢印の根元に相当し、その矢印のネットワークから仲間はずれになっているインスタンス、即ち根元から辿ることができないインスタンスが削除対象になる。

ファントム参照

  • オブジェクトに対してガベージコレクションが行われたことを知らせることを目的とする。

参考文献

  • 『オブジェクト指向でなぜつくるのか』