第6回JVMソースコードリーディングの会

http://www3179ua.sakura.ne.jp/events/5130d540-436b-4b89-9d2d-1fa884b9625c

キャンセルをキャンセルできなかったけど、とりあえず近いから行ってみたら参加できて良かった。

Concurrent Mark and Sweep な話。 GC の仕組み自体はなんとなくわかった気になってるけど、他の GC とからむとかが面白いなと思った。

Parallel GC の mark に 1bit 、 lock のために 1bit オブジェクトが持ってて、 CMS は別の領域使って card marking してる、と。

(追記: この文章の Parallel GC は -XX:+UseSerialGC をつけた時の full GC とかが正しいとのこと、コメント参照) 気になったのはなんで Parallel GC の mark bit をそのまま CMS も使えないのってことで、おそらく Parallel GC 中に mark されたものの状態がヘンなことになってて、そのへんで混乱が起きるんじゃないか…てことだったと思う。私の理解では、 Parallel GC は stop the world しちゃってるので、 mark したオブジェクトに対して大胆なことができて、 Parallel GC 中に mark する時は、中に置いてあった hash 値をよそのバッファに動かしておいて、かわりに forwarding pointer を置いておくそうな。 Java の hash 値は絶対 0 にならないようになっていて、 0 ならまだ計算されてないってことなので、この移動は必要なくて、普通のプログラムではあまり問題にならない移動、とのこと。

こういう仕組みなもんだから、小さいオブジェクトを大量に作ってそれぞれに hashCode() を呼んでやると、 GC 時に使うメモリ消費量ががばっと増えたりするらしい。 GC するとメモリ使用量が増えるとか素敵(してる最中だけだけど)。これって -Xmx256m とかして指定してるヤツには支配されないですよね、って聞いたらそうとのことで、他にこういう GC の管理下に無いメモリ消費としては、 thread なんかを作ったらスタックのぶん増えるよね、とかあるらしい。存在してるオブジェクトの数に比例して増えうる余計なメモリ消費しうる、ってのは面白いな、と。

逆に CMS の card marking の方を Parallel GC の方でも使う…っていうのは効率が良くないだろう、とのこと。

template interpretter は要は Xbyak みたいなマクロアセンブラがあって、それで生成されたコードの間を jump で飛びまわる感じで、 interpretter は動いている、と。その中の ABI は独自でやってて、たぶん gdb の bt とかは stack 壊れてると思うよね…みたいな話を。そんなことせんでも JIT 効くまでの期間の効率とか忘れて C++ で書いておいたらいいんじゃないの…とか思ったけど、まぁやはり初回実行も速くしたいのかなぁとのこと。あとの飲み会で Xbyak 作った herumi さんの感想を聞きたかった…と言ったら nminoru さんも作ったことあるとのことで、どうもみんな作るべきものらしい。

C++ に比べてマクロアセンブラの方が速くなる理由としては、連続してる命令の種類によってはわざわざメモリに置かずにレジスタでデータを持ちまわれるでしょ、ってことがあるぽい。具体的には前回命令によって次の命令実行する時の stack top の型が決まるわけだけど、その stack top の型ごとに別な命令を生成してる、と。

Zero と Shark は、 template interpretter の方を libffi 使って移植する時にアセンブラいらずにして、 JIT の方を LLVM に丸投げして移植をラクにする、と。今風! っていうか libffi+LLVM のと Java の移植性やら信頼度なんかを比較すると、 Java の方が上だよね…とかなんとか。そもそも LLVMJVM ってライバルっていうかわりと同じ志持ってるような面がある気がして、 JVM on LLVM ってのは、 Ruby on Python みたいな違和感も個人的にはあり。

あと SSA の上に SSU や SSI なんてのがあって、 wikipedia 見てもなんのこっちゃわからなかったのだけど、 nminoru さんに用語解説してもらって、しかしまだよくわからない。たぶん分岐関係のなにか。 phi 関数の逆みたいな関数があってとかなんとか。

あと識別子の名前のつけかたでいくつか面白いのがあるなあと。 do_oop とかは前も見たっていうか oop て結局なんの略か聞くの忘れた… *_careful とか面白いな…とか。

あと飲み会はいろいろ。 ia64 がすばらしいとか x86-64 直球すぎるやろ、とか。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h