すべてのプログラムは、「割り当てられたメモリをいつ解放するか」という問いに答えなければならない。一般的な答え方は3つあり、それぞれが異なるものを犠牲にしている。
自動ゴミ収集
プログラムは気兼ねなく配布し続け、定期的に回収担当者が巡回して、誰も利用しなくなったエリアを特定し、回収すればよい。
- メリット:プログラマーはほとんど考える必要がなく、解放済みのメモリ領域を使用することによるエラーが発生しない
- デメリット:ガベージコレクションの実行時に予測できない停止が発生し、必要以上にRAMを消費する
サーバーサービスや業務用アプリケーションに適しています。これらは、最大遅延よりもスループットが重視される場面です。
参照カウント
各オブジェクトにはカウンタが1つずつ割り当てられています。参照が追加されるとカウントが増加し、参照が削除されるとカウントが減少し、0になると直ちに解放されます。
- 長所:適切なタイミングで解放され、予期せぬ停止がない
- デメリット:代入のたびにコストがかかり、参照ループを自動的に処理できない — AがBを保持し、BがAを保持している場合、両方の値は決して0にならない
所有と借用
コンパイラは、誰がメモリ領域を所有しているかを追跡し、コンパイル時に適切な場所に解放命令を挿入します。ガベージコレクタもカウンタも不要で、実行時のオーバーヘッドは一切ありません。
- メリット:手動での管理と同様に迅速かつ予測可能だが、安全である
- デメリット:記述者は新しい思考モデルを習得する必要があり、一部のデータ構造は表現しにくくなる
絶対的な勝利という選択肢はない
リアルタイムシステムや組み込みソフトウェアは、停止が許されないため、第3の選択肢を採用します。一方、Webアプリケーションは、数十ミリ秒よりも人の時間を節約することが重要であるため、第1の選択肢を採用します。どちらもそれぞれの文脈においては正しいのです。
Thảo luận