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

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



(株)ネットジーンの村山です.

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

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

つまりは,
・Java言語のレベルでみると「11個が正解である」.
・Javac等バイトコードコンパイラの実装では,必ずしも11個すべてが
  GCの対象になるという保証は無い.それはあくまで実装依存.
・現在のバイトコードコンパイラの実装の大半では,最後の
  参照が残るような実装が取られている.
ということでは.

で,元の問題はあくまでJava言語仕様のレベルでの問題なんですよね?
だとするとやはり「11個が正解」だと思います.

それに,どんなバイトコード列にコンパイルするかは,Javaバイト
コードコンパイラの実装依存の話なんで,言語とは無関係な話です.
例のバイトコードにしてみたって,あくまで一つの例に過ぎず,
ループを抜けた時点で「aconst_null,astore_2」を入れて上書き
しても,実装上の問題はないはずです.
#通常はコードサイズ,及びパフォーマンスの観点からそのような
#実装はまずしないと思うけど.

極端な話,11個のローカル変数領域に次々と書き込んでいくような
バイトコードを書いても,仕様には準拠していると言えるのでは....(^^;
#本当に許されてるかは微妙な問題.一度言語仕様を隅々まで
#チェックしないと断言できない.

#たとえ許されてても,すごい無駄.11個でも十分無駄だが,
#これが100とかになると恐怖のwide命令の嵐になる.

##ところで,これってパズルのネタになりませんかね??


> そうすると WeakReference って何? という無知をさらけだしてしまうわけですが…。
「弱参照以外の参照がすべてなくなった時点で,参照先の
インスタンスがGCの対象となるような特殊な参照」と
いうので良いはずですが.
#ちなみに対象とはなるけれど,即時回収される保証は無い.


いずれにせよ,GCによって即時回収することは通常ありえないので,
10個か11個かという議論は実用上ほとんど無意味なんですけどね.
それこそ保守的GCを取ってると,平均で1割くらいは誤差が出るそう
です.(メモリリークみたいなもの.ただし,メモリリークと異なり
単調増加はしない.)世代別GCでも,一度殿堂入りしたインスタンスは
滅多に回収されないですし.