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));
}
}
}
変数のスコープとガベージコレクションのタイミングは別と考えてよろしいのでしょうか?
別と考えていいでしょう。
実際にガベージ・コレクションがどのタイミングで発生しているかを知るには、JVMの -verbose:gc オプションを使って調べることができます。
Java の GC は、他言語に比べ、かなり複雑です。JVMの実装によって変わってくるのはもちろんのこと、CPU稼働状況によって変化するように設定することもできます。
仕様書として最も詳しいものは「Memory Management in the Java HotSpot. Virtual Machine」だと思うのですが、日本語版が出ているかどうかは分かりません。
変数のスコープとガベージコレクションのタイミングは別と考えてよろしいのでしょうか?
別と考えていいでしょう。
実際にガベージ・コレクションがどのタイミングで発生しているかを知るには、JVMの -verbose:gc オプションを使って調べることができます。
Java の GC は、他言語に比べ、かなり複雑です。JVMの実装によって変わってくるのはもちろんのこと、CPU稼働状況によって変化するように設定することもできます。
仕様書として最も詳しいものは「Memory Management in the Java HotSpot. Virtual Machine」だと思うのですが、日本語版が出ているかどうかは分かりません。
回答ありがとうございます。
なかなか複雑な仕組みなのですね。特に、「GCアルゴリズム詳細解説」は面白そうなサイトですね。頑張って読み進めてみます。
なにかいくつか誤解があるようです。
変数tmpのスコープは最初のforループが終わったところなので、生成したインスタンスもそのときに破棄される
変数 tmp のスコープは確かに for ループ内で完結しています。
ただ、生成したインスタンス(Integer)の生存期間は変数のスコープとは直接関係ありません。
(組み込み型である int なら変数のスコープ終了と同時に破棄されますが)
インスタンスが破棄される条件はそのインスタンスへのリファレンスが無くなったときです。
この場合、mylist.add() で mylist オブジェクトの中にリファレンスを格納しているのでオブジェクトは生存し続けます。
mylist オブジェクトが破棄された段階で初めて格納された各 Integer オブジェクトも破棄の条件を満たします。
また、オブジェクトが破棄の条件を満たすこととそれがガベージコレクションされることはまた別の話です。
Java の場合、通常のプロセスとはまったく別のところでガベージコレクタが動作しますので実際に
ガベージコレクションが行われるタイミングをコントロールすることは出来ません。
また、このプログラムの動作にガベージコレクションのタイミングは一切関係ないように思えます。
回答ありがとうございます。
ご指摘の通り、プリミティブ型とごっちゃになったためかと思います。
>変数のスコープとガベージコレクションのタイミングは別
別です。
GCは本来そういうものです。
オブジェクト=NULLと明示的に書けば、
ガベージコレクションの対象だとわかりやすいので、
JVMも助かります。
回答ありがとうございます。
なるほど、本来そういうものなのですね。オブジェクト=NULLは覚えておきます。
回答ありがとうございます。
なかなか複雑な仕組みなのですね。特に、「GCアルゴリズム詳細解説」は面白そうなサイトですね。頑張って読み進めてみます。