teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

補記追加

2015/11/24 14:37

投稿

KSOH
KSOH

スコア12

answer CHANGED
@@ -5,4 +5,6 @@
5
5
 
6
6
  そんなわけでGarbage Collectorは任意のインスタンスが「使われなくなったかどうか」の判断のために、実行スタック(ローカル変数やメソッドの引数を覚えておく領域)から参照される可能性があるインスタンスを調べ上げます。クラスの静的フィールドに参照があったとしてもそれを基点として特別扱いはしません。なぜならクラス自体も、どこからも参照されなくなれば回収可能だからです。(もっともそういうクラスの利用はかなり特殊なプログラムになりますが)
7
7
 
8
- 静的フィールドに覚えておくと普通はプログラム終了時点までインスタンスは生存し続けますが、それは静的フィールドが存在しているクラスオブジェクトの参照が実行スタックからたどれるからに過ぎません。実行スタックにはローカル変数やメソッドの引数はもちろんですが、実行中のメソッドがなにかも記録されています。スタックにあるメソッドMが存在しているとメソッドM実行中はそのメソッドが定義されているクラスオブジェクトも存在し続ける必要があります。さらにそのクラス(のフィールドやメソッド)が直接・間接に参照している別のクラスも同様に存在し続けなければなりません。そういう関係もGarbage Collectorはたどっていきます。そんなわけで静的フィールドに覚えておくとたいていはプログラム終了時までずっと消えなくなるのです。
8
+ 静的フィールドに覚えておくと普通はプログラム終了時点までインスタンスは生存し続けますが、それは静的フィールドが存在しているクラスオブジェクトの参照が実行スタックからたどれるからに過ぎません。実行スタックにはローカル変数やメソッドの引数はもちろんですが、実行中のメソッドがなにかも記録されています。スタックにあるメソッドMが存在しているとメソッドM実行中はそのメソッドが定義されているクラスオブジェクトも存在し続ける必要があります。さらにそのクラス(のフィールドやメソッド)が直接・間接に参照している別のクラスも同様に存在し続けなければなりません。そういう関係もGarbage Collectorはたどっていきます。そんなわけで静的フィールドに覚えておくとたいていはプログラム終了時までずっと消えなくなるのです。
9
+
10
+ 補記:raccyさんの回答にある「発想が逆」という言葉。まさにそう思いました。プログラマーがGarbage Collectorがどう動くか考えて設計するのではなく、逆に**自然に記述されたプログラムが適切に動作するようにGarbage Collectorの方がよろしくやってくれる**と考えるべきだと思いマス。