hogeとはワイルドカードのようなものです。日々起こった、さまざまなこと −すなわちワイルドカード− を取り上げて日記を書く、という意味で名付けたのかというとそうでもありません。適当に決めたらこんな理由が浮かんできました。
01/23/2008 ああ [長年日記]
tDiary 1917日目
■ [日記] stream と gc
先輩につっこまれてはっと思ったので書き残しておく. 言われてみれば当然のことなんだけど,普段からこういうことを意識してないのはまずい気がするので,戒めも兼ねて.
Java で stream を open した後はきっちり finally 内等で close することが重要だが,そのこころは,Java の gc はオブジェクトがスコープを抜けても即時に破棄するわけではないので,close されるタイミングが分からなくなって,もしもファイルをロックしたままだったりするとロックが解放されるタイミングも謎になり,はまる原因になるから.
んで気になってちょっと調べてみた. 間違ってたら指摘して頂けるとこれ幸い.
- Java (Sun JDK)
- 世代別 gc (アルゴリズムは mark-weep 方式など色々) を採用しており,gc はいつ動くか分からない.
- Python
- gc は参照カウント方式を採っており,参照がなくなれば即時でオブジェクトは破棄される.
- Perl
- gc は参照カウント方式を採っており,参照がなくなれば即時でオブジェクトは破棄される.
- Ruby
- gc は mark-sweep 方式を採っており,gc はいつ動くか分からない. が,open に関してのみ言えば,open にブロックを渡すとブロック終了時に自動的に close はされるのだとか.
- PHP 4 以降
- gc は参照カウント方式を採っており,参照がなくなればオブジェクトは破棄される (が,即時でかどうかはちょっとよく分からなかった...).
つかまあ自動で close されるとしても close はちゃんと明示的に呼んだ方が良いでしょうな. ちなみに Python2.5 なら with file(...) as fp が cool.contextlib.closing も場合に応じて利用するとハッピー.