4

これを実行します:

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 スクリプトのフレーム (コンテキスト?) 内で、かなりひどいメモリ リークが発生するようです。

4

1 に答える 1