まず大前提として、使うコンピューターの規模に対して使うメモリの量や要求される性能がそこまで大きくない場合は、ガベージコレクタ任せで基本的に問題ありません。逆に
- Androidなど、リソースが少ない環境への実装
- バッチ処理などで大量のメモリを使う場合
- 3Dのゲームなど、高度のリアルタイム性が求められる場合
には、ガベージコレクタの動きを考える必要が出てきます。
そして、PHPとRuby/Javaでは、ガベージコレクタの仕組みが大きく違います。
PHPでは「オブジェクトが使われる数を記録しておいて、それが0個になったらすぐ解放」という参照カウント方式をメインに使っています。こちらでは、自分でunset()
すればその場で解放されるなど細かく制御できますが、循環したものが消えない問題があります。
RubyやJavaでは、ときどきメモリの使用チェックが回ってきて、参照不能なものを解放するというマーク・アンド・スイープという方式を取っています。こちらでは、一度使ったメモリは任意のタイミングでは解放されず、ガベージコレクタが回収してくれるのを待つ他ありませんし、ガベージコレクタがいつ実行されるのかも制御できる範囲に限界があります(そして、ガベージコレクタの実行にも時間を消費します)。
あと、どんなガベージコレクタにも共通ですが、あるオブジェクトへアクセスするルートが残っていると、どうあがいてもガベージコレクタは解放しません。クロージャなどでいつの間にか変数への参照ができてしまう場合があるので、注意が必要です。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。