PC-8001いじってた時代から、何となくココロに
引っかかってモヤモヤしていたガベコレ。
最近の開発言語とかは一旦おいておいて、PC-8001
の時代って、どうだったんだっけ?と思って、ふと
検索。
http://www.yoriki.jp/smalltalk/academy02.html
うん。なんか、そうそう。そういうもやもや感があった
よねぇ…。
って思って、あらためてPC-8001(エミュレータ)で、
ガベコレが起こるときって、どんなだったっけ?と
思って、ガベコレしそうなプログラムを書いてみる。
適当に文字列たくさん扱う処理を書いてみるも、あまり
処理が止まったりする感じが見えなかったので、全体的
に処理を見直す。
配列の大きさとか、変数エリアのサイズとか、更新の
かけ方とかなのかな?と思って、もっと負荷がかかり
そうな処理に変えてみた。
こんな感じ。
要素300個の配列を作ってみて、そこに1~30文字の
長さがランダムな文字列をぶっこんでいって、それを
表示。300個終わったらまた1から、というかんじ。
なにしろ、メモリを使いきらないとガベコレ発生
しないだろうし、発生しても、生き残る文字変数が
いっぱい無いと一瞬で終わっちゃうだろうから、
生き残りやすいしぶとい処理にしてみた。
実行してみるとこんな。
変数エリアには10000バイト(10k)を確保して、そこに
平均では、15文字×300=4500バイト+αの文字列データ
が格納されるという感じ。
(最低でも4500バイトくらいは生き残るという計算)
実際は、途中に出てくる「c$」っていう変数が、
じゃんじゃん更新かかって無駄食いするので、
300のループが回る前にじゃんじゃんガベコレ発生する
という感じになる。
具体的には、10~数10行毎に1回、5秒くらいの停止時間
が発生するみたい。c$に1文字ずつ足す度に、別の
メモリが割り当てられてるんだろうな。
もちろんガベコレの間はSTOPキーも効かない。
うーーーーーん。なんか、もうちょっといっぱい時間
掛かったような記憶があるんだけど、違うんだっけ?
こんなだったっけ?
ちなみに、この位のメモリを相手にしたガベコレだと、
ロジックもきっと単純で、想像だけど、マークアンド
スイープだけなんじゃないかな。
まぁ、やっぱガベコレ発生すると、処理が止まって
しまってワンワンワワンだよな。現代のプログラム言語
でも、ガベコレのチューニングまわりは色々難しい
んだろうなぁ。今まであんまり考えたこと無かったけど。
で、あらためて最近のガベコレについて調べ直してみる。
http://gihyo.jp/dev/serial/01/jvm-arc/0005
http://www.atmarkit.co.jp/ait/articles/0404/02/news079.html
http://itpro.nikkeibp.co.jp/article/COLUMN/20060612/240657/
この辺を眺めると、やっぱこの間見てたような、
・マークアンドスイープ
・(場合によってはコンパクションを組み合わせ)
・コピーGC
・世代別GC
っていう組み合わせになるんだろうなというのが
何となく分かった。これ以外になにか考えろ、と
いわれても、オイラの頭ではなかなか考えつかない
なぁ。
それにしても、JAVAって、やっぱメモリ管理まわり
が一つの売りでもあって、GCによるパフォーマンス
チューニング用に、ユティリティーやライブラリが
色々備わってるんだな。その辺はさすがだな。
オイラはJAVA嫌いなんだけど、よくできてるところは
やっぱホントによくできてるなと思うし、この部分が
あれやこれや別の言語でも使えるといいよなとか
思ったり。
でもやっぱ、コロコロ変わる仕様と、バギーだったり
セキュリティーホールバリバリな感じがねぇ…
あと、数値型変数の種類がねぇ。
なんで正値型(いわゆるunsigend)が使えないん
だろう…16進データで大小関係調べるのとか、
けっこう困るんだよな。
LLVMつかう言語がいっぱい増えるといいよな。
選択肢は大事だ。
JVMとか.NETとか、どうしても好きになれないん
だよな。
まぁどっちかっていうと、二者なら.NETの方が
好きな感じだけど、以前VBで.NET任せのメモリ
管理させたプログラムがウンコなパフォーマンス
になっちゃった経験から、やっぱ嫌だ。
まぁ、これはVM次第っていうよりは言語仕様次第
なんだろうけど、せめて、C言語系の場合くらい、
ヒープ確保みたいな明示的なメモリ制御が出来る
ようになってるといいんだけどな。
あと、P言語系で、インタプリタじゃなく、VM上で
動くようにする試みがあるけど、ああいう取り組み、
じゃんじゃん進むといいなぁ。
それにしても、
http://mag.autumn.org/Content.modf?id=20031205150709
ここで取り上げられている怪文書。
ネタだろうとは思うけど、
「時が未来に進むと誰が決めたのだ。」
とか、おもしろすぎ。
|