ここから本文です

javaのガベージコレクションについて。 javaのガベージコレクションは、そのオ...

kat********さん

2010/2/811:49:33

javaのガベージコレクションについて。

javaのガベージコレクションは、そのオブジェクトへの参照数をもとに廃棄するタイミングを決めていると聞いたのですが、 これはつまり、その条件(誰かから参照を受けている)を満たす限りにおいては絶対に廃棄されることはないということなのでしょうか。
例えば、

A→B⇔C

のような場合、AからBへの参照を切ったとしてもBやCは永遠にメモリ上に存在してしまうということになるのでしょうか。

また、

A→B→C

のような場合にAからBへの参照を切った時は、Bが廃棄され、それに応じてCも廃棄されると期待して良いのでしょうか。

図などが解りにくいかもしれませんが、よろしくお願いします。

閲覧数:
1,255
回答数:
2

違反報告

ベストアンサーに選ばれた回答

ttkai00さん

2010/2/815:46:05

ガベージコレクションのアルゴリズムとしては、参照カウンタ方式と、マーク・アンド・スイープ方式が有名ですが、参照カウンタ方式だとご質問の最初のケースのような、いわゆる「循環参照」があった場合に、回収できなくなります。

マーク・アンド・スイープ方式なら、循環参照されていようと、島として孤立していれば回収対象となります。

公式な資料は見つけられませんでしたが、Java はマーク・アンド・スイープ方式らしい記述がいくつかのページに書いてありましたので、おそらく回収してくれるものと思います。

ちなみに、参照カウンタ方式を用いていることで有名なのは 6.0以前の旧VBで、よく循環参照の問題は指摘されてきました。(.NET はマーク・アンド・スイープなので、最近の VB は大丈夫です)


また、先の回答者さんの回答に補足でもう1つ付け加えるなら、GC が実際に行われても、回収対象になっているものすべてが回収されるとは限りません。

詳しくはこちらが参考になると思います。

http://www.itarchitect.jp/technology_and_programming/-/27047-3.html

質問した人からのコメント

2010/2/11 10:34:17

ガベージコレクションの仕様について自信が持てるようになるまでは、なるべく全ての参照を切るように心がけていこうと思います。
ありがとうございました。

ベストアンサー以外の回答

1〜1件/1件中

mar********さん

2010/2/813:40:05

>AからBへの参照を切った時は、Bが廃棄され、それに応じてCも廃棄されると期待して良いのでしょうか
いいえ。
GCの対象にはなっても、
GCが実際に行われるかどうかは、VMの実装次第です。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる