2015-12-24 8 views
9

私はMozillaのJavascriptチュートリアルを元に戻していました。何らかのメモリが必要かどうかを知るのはなぜ難しいのですか?

ハイレベル言語は、ジョブに割り当てられたメモリの一部が 場合にはもはや必要ないとき見つけるメモリ割り当てを追跡し、 するために使用することがある「ゴミ コレクタ」と呼ばれるソフトウェアを埋め込みます自動的に解放されます。この処理は、 のメモリが必要かどうかを知るという一般的な問題は決めることができないため(アルゴリズムでは解決できないため)、近似では です。

私は不確定性とガベージコレクタの概念に精通していますが、なぜこれが決定不可能な問題なのか分かりません。

+0

メモリが最後に参照されたときを知る方法を教えてください。 –

答えて

6

すべてのガベージコレクタ私は、アクセスできなくなったメモリを収集することで作業に精通しています。それを指す変数のすべての(推移的閉包)が範囲外になりました。しかし、これは収集できるメモリスペースの集合の過小評価です。なぜなら、いつでもメモリロケーションが範囲内の変数を指し示している可能性がありますが、再びアクセスされることはないからです。

収集することができるメモリ空間の正確なセットは、任意の未決問題に対する自明に還元可能である見つける - 例えば、次のプログラムの点Aで収集することができるメモリ空間のセットを見つける:

x = allocate() 
// Point A 
if (result of some known-to-be-undecidable problem is true): 
    print(x) 

そのセットを見つけること自体が決めることはできません。

+0

未定義の問題に還元することは自明ではない –

+2

@NursultanZarlykは、if文でテストした問題の解を 'P'と命名し、' x'によって指されるメモリがコレクタの判断点Aで「C」として収集することができる。 'P =>!C''と呼ばれます。そうでなければ、私たちのコレクターはライブメモリーを収集するかもしれませんし、私たちの仮説コレクターは過大に近似していないので'!P => C'です。これは、 'P'の解も' C'の解であることを意味します。私はここで何が欠けていますか? – Oak

+0

計算理論はいつも私にとって魔法でした。深い答えをありがとう。 –

7

したがって、プログラムを変更してヒープにスペースを割り当て、元のプログラムが終了した場合にのみアクセスすることができます。最適なガベージコレクタは、プログラムが終了しない場合にのみメモリを収集します。

プログラムを終了するかどうかを決定できますか?

関連する問題