シングルトン内で使用したオブジェクトのGC

このQ&Aのポイント
  • シングルトンインスタンス内で使用したオブジェクトは、hogemethodメソッドの終了時にGC対象となり、そのうちGCされますか?
  • hogeMap = null;をすることにより、hogemethodメソッド終了時にGCされるのでしょうか?
  • シングルトンのインスタンスが存在し続ける限り、hogeMapのnullセットの有無はGC対象に影響するのでしょうか?
回答を見る
  • ベストアンサー

シングルトン内で使用したオブジェクトのGC

基本的な質問で恐縮ですが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代入は必要なのか?  } } よろしくお願いします。

  • Java
  • 回答数2
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

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

その他の回答 (1)

回答No.2

hogeMap は、hogemethod() のローカル変数なので、 hogeMap の持つ参照を他に渡すコードが無い限り、 メソッドの実行が終わった段階で GC に対象になるはずです。 #しかし、こういうソースが多いですよね。 #ソースの最後にローカル変数の null クリアコードがずらずらあると #なんかぞっとします。

関連するQ&A

  • CakePHPでシングルトンパターン

    CakePHPでシングルトンパターンで、インスタンスを使いまわしたいのですが、 うまく動作しません。 以下のようなプログラムですが、何か設定が足りないのでしょうか class Test{   public static $instance = null;   public function __construct(){}   public function getInstance(){    if(is_null(Test::$instance)){     Test::$instance = new Test();    }    return Test::$instance;   } } 上記クラスを以下のように呼び出しております。 $instance = Test::getInstance(); 何度やっても、インスタンスが新しく生成されてしまします。 良い方法がございましたら、ご教授下さい。

    • ベストアンサー
    • PHP
  • C++ シングルトン マルチスレッド

    標準C++でシングルトンを実装したいのですが。 class Singleton{ public: static Singleton* getInstance(){ if (_instance == NULL){ //スレッドAがこの時点で、スレッドBがNULLチェックすると破綻する _instance = new Singleton(); } return _instance; } private: Singleton(); static Singleton* _instance; }; マルチスレッドになると上記のパターンで破綻するといわれどうしたものかと考えております。 static Singleton* _instance = new Singleton(); と出来れば解決なのですが 「static const int データメンバ以外をクラス内で初期化することはできません」 とのことでそれもできず。 どのようにすればよいでしょうか。

  • 同期について

    ちょっと疑問に思ったので質問させてください。 たとえばあるオブジェクトに対して同期(ここではinstance)する場合、ケース1とケース2では違いがありますでしょうか? ケース1: public static Test getInstance() {   synchronized(instance) { if(instance != null) { return instance; } else { instance = new Test(); return instance; } } ケース2: public static synchronized Test getInstance() { if(instance != null) { return instance; } else { instance = new Test(); return instance; } } 以上宜しくお願いします。

    • ベストアンサー
    • Java
  • singletonパターン

    デザインパターンを勉強しているのですが、一つ気になっていることがあります。singletonパターンを使うとき、staticなメソッドgetInstance();で、唯一のインスタンスを得る場合、コードは Singleton obj1 = Singleton.getInstance(); となります。ここで疑問に思ったんですが、あるメソッドを使う場合、 instance名.method();という具合に記述されるんですが、この場合、 class名.method();となっています。メソッドを使うときって、class名.method();でも大丈夫なんですか?質問文がわかりにくいかもしれませんがどうぞよろしくお願いします。

    • ベストアンサー
    • Java
  • クラス、インスタンスメソッドについて

    JAVA初心者です。 現在、先人が作ったプログラムの修正作業を行っておりますが、 以下の点に疑問があります。(因みに、先人はJAVAのスペシャリストではありません。) あるクラスが以下の様になっております。 public class Sample { private static Sample s = new Sample(); private Sample() { } /** クラスメンバに存在するインスタンス取得 * @return Sampleクラスの唯一のインスタンス */ public static Sample getInstance(){ return s; } public static void methodA(){ ... } } でこのmethodAを使用するには、以下の様にします。 Sample.getInstance().methodA() これはこれで納得で、うまく動作しますが、これは 結局の所、クラスメソッドにしたかったという事ではないのかな?と 疑問に感じています。つまり、単純に Sample.methodA と呼び出せばうまくいきます。 ところが、たまたまAPIドキュメントを見ていた所、Calendarクラスにもやはり getInstanceというものが存在し、現在日時を取得するのに Calendar.getInstance().getTime() の様に呼び出すと書いてありました。 Sampleクラス、JAVAのCalendarクラス(これに限った事では無いとは思いますが) のこれらのgetInstanceの効用とはなんなんでしょうか? ・クラスの外でnewでインスタンスを作り出さない所 ・それでいてクラスメソッドではない(?)所 この辺りについてご回答よろしくお願いします。

    • ベストアンサー
    • Java
  • &や&=について

    --------------------------------------- class TextSanitizer { function &getInstance() { static $instance; if (!isset($instance)) { $instance = new TextSanitizer(); } return $instance; } } $myts =& TextSanitizer::getInstance(); ------------------------------------------- 上記について3点質問がございます。 1.【&getInstance()】の&は何を意味していますでしょうか? 2.【$myts =& TextSanitizer::getInstance();】の&=は何を意味していますでしょうか? 3.getInstance()関数はどんなとき使用すべきでしょうか? ご検討がつく方アドバイスを宜しくお願いします。

    • ベストアンサー
    • PHP
  • HashMapがおかしい

    HashMap で以下の様にコーディングしました。 当然 map の中には19個のオブジェクトが存在するはずですが、何故か15個しかありません。どなたか原因を御存知でしょうか? HashMap map = new HashMap(); map.put("key1", new Integer(1)); . (2->8)省略 . map.put("key9", new Integer(9)); map.put("key10", new String("10")); . (11->18)省略 . map.put("key19", new String("19")); 以下エクリプスのデバッガで取得したもの。 ECLIPSE 2.1.3 / JDK 1.4.2.03 map= HashMap (id=21) entrySet= HashMap$EntrySet (id=50) keySet= null loadFactor= 0.75 modCount= 19 size= 19 table= HashMap$Entry[32] (id=26) [0]= null [1]= HashMap$Entry (id=28) [2]= HashMap$Entry (id=31) [3]= null [4]= null [5]= null [6]= null [7]= null [8]= null [9]= HashMap$Entry (id=32) [10]= HashMap$Entry (id=33) [11]= null [12]= null [13]= HashMap$Entry (id=34) [14]= HashMap$Entry (id=35) [15]= HashMap$Entry (id=36) [16]= HashMap$Entry (id=37) [17]= null [18]= null [19]= null [20]= HashMap$Entry (id=38) [21]= null [22]= null [23]= HashMap$Entry (id=39) [24]= HashMap$Entry (id=40) [25]= null [26]= HashMap$Entry (id=41) [27]= HashMap$Entry (id=42) [28]= null [29]= HashMap$Entry (id=43) [30]= HashMap$Entry (id=44) [31]= null threshold= 24 values= null

    • ベストアンサー
    • Java
  • メモリの確保とgcについて?

    gcのタイミングとか、その判断基準の話になるのかもしれません。下記の2つのクラスの実行結果の違いがなぜおきるのかわかりません。 理解できる方、解説お願いします。 WindowsXPでエクリプス上で実行しています。実行時のメモリはデフォルトの64MBのままです。 コンパイラ実行環境は1.4系です。 ●テスト・クラス変数1、結果 ◆VM 確保Total:17MB ◆VM 確保Total:44MB ◆VM 確保Total:46MB ◆VM 確保Total:46MB ◆VM 確保Total:46MB ◆VM 確保Total:46MB ●テスト・クラス変数2、結果 ◆VM 確保Total:33MB java.lang.OutOfMemoryError Exception in thread "main" 全部張ると800文字を超えてしまうのでソースの一部のみを記述します。 // クラス変数として宣言、両クラスで共通 private static HashMap map; // テスト・クラス変数1 // mainメソッド中でこの記述が6回記述 map = new HashMap(4000000); map.put("1", "いちご"); System.out.println("◆VM 確保Total:" + Runtime.getRuntime().totalMemory() / 1024 / 1024 + "MB"); // テスト・クラス変数2 // mainメソッド中でこの記述が4回記述 map = new HashMap(5000000); map.put("1", "いちご"); System.out.println("◆VM 確保Total:" + Runtime.getRuntime().totalMemory() / 1024 / 1024 + "MB");

    • ベストアンサー
    • Java
  • デザパタ シングルトンクラスの実態宣言の場所について

    //-----singleton.h---------------------------------------- // Copyright(C) 2003 Yoshinori Oota All rights reserved. #ifndef SINGLTON #define SINGLTON #include <iostream> #include <string> using namespace std; class Singleton { public: static Singleton* Instance(); static void Destroy(); void nextState(); void printState() const; private: Singleton(); ~Singleton(); static Singleton* theInstance; string value_; }; //ここじゃだめなの? //Singleton* Singleton::theInstance = NULL; #endif //------------------------------------------------------- //-----singleton.cpp--------------------------------------- #include"singleton.h" Singleton* Singleton::theInstance = NULL; Singleton::Singleton() : value_("initial state") { } Singleton::~Singleton() { } Singleton* Singleton::Instance() { if (theInstance == NULL) { theInstance = new Singleton(); } return theInstance; } void Singleton::Destroy() { if (theInstance != NULL) { delete theInstance; theInstance = NULL; } } void Singleton::nextState() { if (value_ == "initial state") { value_ = "second state"; } else if (value_ == "second state") { value_ = "third state"; } else if (value_ == "third state") { value_ = "initial state"; } } void Singleton::printState() const { cout << value_ << endl; } //------------------------------------------------------ //----main.cpp------------------------------------------- #include"singleton.h" int main() { Singleton* theSingleton = Singleton::Instance(); theSingleton->printState(); theSingleton->nextState(); theSingleton->printState(); //デストラクタも隠蔽することにより、2重deleteを防げる Singleton::Destroy(); } //-------------------------------------------------------- デザパタのシングルトンを勉強していたのですが、 実態の宣言(Singleton* Singleton::theInstance = NULL;)はヘッダファイル内だとなぜだめなのでしょうか? さらにprivate修飾がついてるのに、なぜNULLにセットできるでしょう。 参照HP http://www002.upp.sonet.ne.jp/ys_oota/mdp/Singleton/index.htm

  • HashMap.putについて

    ご質問させて頂きます。 hashMap.putの使い方が良く分かりません。 例えば、以下のようなkudamono.csvファイルがあるとします。 ------------------- A,2003/01/01,スイカ B,2003/02/01,バナナ C,2003/03/01,メロン D,2003/04/01,イチゴ ------------------- このデータをhashMap.putでセットしたいので 以下のようなクラスにしたんですが コンパイルエラーが出てしまいます。 ------------------- /*HashMap生成(クラス変数)*/ public static HashMap hashMap = new HashMap(); public static void main(String args[]) throws Exception { FileReader filereader = new FileReader("kudamono.csv"); BufferedReader bufferedreader = new BufferedReader(filereader); String line; int i = 1; int j = 0; while((line = bufferedreader.readLine()) != null) { System.out.println("Start line at " + i); StringTokenizer stringTokenizerTest = new StringTokenizer(line, ","); while(stringTokenizerTest.hasMoreTokens()) { HashMap.put(stringTokenizerTest.nextToken().toString()); j++; } i++; } filereader.close(); } } --------------- たぶんHashMap.putをする前に キーをセットしたり変数を宣言したりすると思うのですが その辺が良く分かりません。 ご教授して頂けたら幸いです。

    • ベストアンサー
    • Java