アプリ版:「スタンプのみでお礼する」機能のリリースについて

基本的な質問で恐縮ですがGCについて教えてください。

例えば、シングルトンインスタンス内のhogemethodメソッドにてHashMapのインスタンスを
生成・使用した場合(以下の質問に続く)、

【質問】
hogemethodメソッドが終わればHashMapのインスタンスはスコープを外れるので、hogeMap = null;などしなくてもGC対象となり、そのうちGCされるのでしょうか?いやいや、hogeMap = null; することによりGC対象となり、そのうちGCされるのでしょうか?それとも、nullセットしようがしまいが、シングルトンのインスタンスが存在し続ける限りGC対象とはなってもGCされることは無いのでしょうか?

package hoge;

public class MySingleton {

 private static MySingleton instance = new MySingleton();

 private MySingleton() {}

 public static MySingleton getInstance() {
  return instance;
 }

 public void hogemethod() {
  HashMap hogeMap = new HashMap();
  hogeMap .put("りんご", "apple");
  hogeMap .put("ぶどう", "grapes");
    :
  hogeMap = null; ←★hogeMap をGC対象にするためにはnull代入は必要なのか?
 }
}

よろしくお願いします。

A 回答 (2件)

hogeMap は、hogemethod() のローカル変数なので、


hogeMap の持つ参照を他に渡すコードが無い限り、
メソッドの実行が終わった段階で GC に対象になるはずです。

#しかし、こういうソースが多いですよね。
#ソースの最後にローカル変数の null クリアコードがずらずらあると
#なんかぞっとします。
    • good
    • 0

変数の参照するオブジェクトは、使われなくなった時点でGC対象となります。

(※)
使われなくなった時点とは即ち、メインスレッド・及びメインスレッドから派生した全てのサブスレッドから参照が無くなったら、という意味です。
hogeMapはローカル変数で、かつより広いスコープの変数に参照を渡しているわけでも無いので、
明示的にhogeMapにnullをセットすればその時点でhogeMapの保持するオブジェクトはGC対象となりますし、
明示的にnullをセットしなくてもhogemethodを抜けた時点でGC対象となります。
シングルトンとかは関係ありません。
従って、「★hogeMap をGC対象にするためにはnull代入は必要なのか?」に対する答えとしては、「必要ではない」となりますね。

※システムでプールしているオブジェクトなんかはどうなるかわかりませんが・・・
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!