これを実行します:
for i in range(1000000000):
a = []
作成中のリスト オブジェクトがガベージ コレクションの対象としてマークされないようです。メモリ プロファイラーから見ると、インタープリターのスタック フレームがすべてのリスト オブジェクトを保持しているように見えるため、GC はそれについて何もできません。
これは設計によるものですか?
編集:
問題のより良い例を次に示します。以下のコードをメモリ プロファイラーで実行します。
a = [b for b in range(1000000)]
a = [b for b in range(1000000)]
a = [b for b in range(1000000)]
a = [b for b in range(1000000)]
a = [b for b in range(1000000)]
a = [b for b in range(1000000)]
a = [b for b in range(1000000)]
リスト内包表記中に割り当てられたメモリがガベージ コレクションされないことがわかります。これは、作成されたすべてのオブジェクトが DLR の InterpreterFrame オブジェクトによって参照されているためです。
これを実行します:
def get():
return [b for b in range(1000000)]
a = get()
a = get()
a = get()
a = get()
a = get()
a = get()
a = get()
プロファイラーの下で、ここのメモリが適切にガベージ コレクションされていることがわかります。関数が終了すると、関数の InterpreterFrame がクリアされるため、これが機能すると推測しています。
それで、これはバグですか?これにより、IronPython スクリプトのフレーム (コンテキスト?) 内で、かなりひどいメモリ リークが発生するようです。