[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 10316] Re: GC の対象にな るのは?



お恥ずかしい、Google検索を忘れておりました。

On Thu, 03 Oct 2002 14:05:44 +0900, according to the article
"[jfriends-ml 10315] GC の対象になるのは?"
Wataru Fukushima <w.fukushima@xxxxxxxxxxxxxxx> wrote:

> 以下の問題がどうしてもわかりません。どなたか解説していただけますか? (_ _)
> 
> 
> 出展:SUN 教科書 Java 2 (試験番号:310-025)
>       ビル・ブローデン著、有限会社トップスタジオ 訳編、翔泳社 発行

原著が洋書なだけに、Google検索すると過去にも「11じゃん」と主張する人が。
http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&f=1&t=000126
http://www.javaranch.com/maha/Discussions/Garbage_Collection/Garbage_Collection_-_JavaRanch_Big_Moose_Saloon.htm

で、ここは「10個」という主張で:
http://www.lanw.com/java/localvariables.htm
| :
| In the garbage collection process, the stack frames belonging to a Thread
| are one of the areas examined for object references. Any object having a
| reference in the stack frame will not be garbage collected.
|
| It is important to note that the concept of scope of a variable does not
| appear to have anything to do with the way in which the garbage collection
| process looks at the stack frames of Threads. The scope of a variable is
| enforced by the compiler, not the JVM.
| :

ということで、
・変数のスコープはコンパイラにとっては意味あるけどJVMにとっては意味ない。
・ローカル変数はメソッド実行中は(スコープが外れても)参照が残っている
のようです。

ここにも。
http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&f=1&t=000126
| ... As I understand it, the JVM will allocate stack space for all local
| variables the moment you start executing countDown(). They are only
| deallocated when you leave the method. So the lifetime (as opposed to the
| scope) of the "tmp" variable is the entirety of the countDown() method.
| :

実際、私が javap した結果も、下記のようになっているわけで、下記「理解できな
くもない」ことがあたりのようです。

> Method void countDown()
>    0 bipush 10
>    2 istore_1
>    3 goto 21
>    6 iload_1
>    7 invokestatic #2 <Method java.lang.String toString(int)>
>   10 astore_2
>   11 getstatic #3 <Field java.io.PrintStream out>
>   14 aload_2
>   15 invokevirtual #4 <Method void println(java.lang.String)>
>   18 iinc 1 -1
>   21 iload_1
>   22 ifge 6
>   25 getstatic #3 <Field java.io.PrintStream out>
>   28 ldc #5 <String "BOOM">
>   30 invokevirtual #4 <Method void println(java.lang.String)>
>   33 return
> -------------------------------------------------------------
> 
> これを見ると、変数2番にtmpが格納されているようです。行番号10で毎回上書きされ
> ていることと、2番にtmpになるもの以外代入されていなさそうなので、「最後の1個
> の参照のみが残っている」のか、と理解(?)できなくもないですが…。

2番に上書きしているときに、前の変数はGC対象になる、と。

> ■実験2 WeakReferenceを使って参照の確認。
> 
> 下記プログラムを実行すると、weak1では11個すべて値が保持されており、gc()後の
> weak2では11個すべてnullになっていました。ってことは、スコープが外れても参照
> が残っている(?)ことはわかりましたが、11個すべてがGCの対象になっているという
> ことではないんですかね?

そうすると WeakReference って何? という無知をさらけだしてしまうわけですが…。

いやー、しかし、GCやらバイトコードやら、奥が深いです。

---------------------------------------------------
(株)PFU システム事業部ソフトウェア統括部第二開発部
      福嶋 航  w.fukushima@xxxxxxxxxxxxxxx