[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