人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Java言語でのガベージコレクションと変数のスコープとの関係について教えてください。以下のプログラムをコンパイル/実行したところ、

mylist = 10
mylist = 110
mylist = 210
<<中略>>
mylist = 910

という結果になりました。変数tmpのスコープは最初のforループが終わったところなので、生成したインスタンスもそのときに破棄されると考えていたのですが、実行結果を見る限り違うようです。変数のスコープとガベージコレクションのタイミングは別と考えてよろしいのでしょうか?

できましたら、該当するJava言語仕様へのリンクも示していただければ嬉しいです。

以上、よろしくお願いします。

--- ソース ---
import java.util.*;

class sample {
public static void main(String[] arg) {
List<Integer> mylist = new ArrayList<Integer>();
for( int i=0 ; i<10 ; i++ ){
Integer tmp = new Integer(i*100+10);
mylist.add(tmp);
}
for( int i=0 ; i<10 ; i++ ){
System.out.println("mylist = " + mylist.get(i));
}
}
}


●質問者: みよひで
●カテゴリ:コンピュータ
✍キーワード:910 ADD ArrayList Class Java
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● pahoo
●35ポイント ベストアンサー

変数のスコープとガベージコレクションのタイミングは別と考えてよろしいのでしょうか?

別と考えていいでしょう。

実際にガベージ・コレクションがどのタイミングで発生しているかを知るには、JVMの -verbose:gc オプションを使って調べることができます。


Java の GC は、他言語に比べ、かなり複雑です。JVMの実装によって変わってくるのはもちろんのこと、CPU稼働状況によって変化するように設定することもできます。


仕様書として最も詳しいものは「Memory Management in the Java HotSpot. Virtual Machine」だと思うのですが、日本語版が出ているかどうかは分かりません。


参考サイト

◎質問者からの返答

回答ありがとうございます。

なかなか複雑な仕組みなのですね。特に、「GCアルゴリズム詳細解説」は面白そうなサイトですね。頑張って読み進めてみます。


2 ● b-wind
●30ポイント

なにかいくつか誤解があるようです。

変数tmpのスコープは最初のforループが終わったところなので、生成したインスタンスもそのときに破棄される

変数 tmp のスコープは確かに for ループ内で完結しています。

ただ、生成したインスタンス(Integer)の生存期間は変数のスコープとは直接関係ありません。

(組み込み型である int なら変数のスコープ終了と同時に破棄されますが)

インスタンスが破棄される条件はそのインスタンスへのリファレンスが無くなったときです。

この場合、mylist.add() で mylist オブジェクトの中にリファレンスを格納しているのでオブジェクトは生存し続けます。


mylist オブジェクトが破棄された段階で初めて格納された各 Integer オブジェクトも破棄の条件を満たします。


また、オブジェクトが破棄の条件を満たすこととそれがガベージコレクションされることはまた別の話です。

Java の場合、通常のプロセスとはまったく別のところでガベージコレクタが動作しますので実際に

ガベージコレクションが行われるタイミングをコントロールすることは出来ません。

また、このプログラムの動作にガベージコレクションのタイミングは一切関係ないように思えます。

ガーベジコレクション

◎質問者からの返答

回答ありがとうございます。

ご指摘の通り、プリミティブ型とごっちゃになったためかと思います。


3 ● ken33jp
●26ポイント

>変数のスコープとガベージコレクションのタイミングは別

別です。

GCは本来そういうものです。

オブジェクト=NULLと明示的に書けば、

ガベージコレクションの対象だとわかりやすいので、

JVMも助かります。

◎質問者からの返答

回答ありがとうございます。

なるほど、本来そういうものなのですね。オブジェクト=NULLは覚えておきます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ