3

REPLでのSBCLガベージコレクターの次の動作に少し戸惑っています。2つの関数を定義します。

(defun test-gc ()
  (let ((x (make-array 50000000)))
    (elt x 0)))

(defun add-one (x) (+ 1 x))

次に実行します

(add-one (test-gc))

元の配列を参照するものはもうないと思います。それでも、(部屋)が報告するように、メモリは解放されません。(test-gc)を直接実行した場合、SLIMEまたはのどこかに参照がスタックしている可能性があることは理解できます。

(list * ** ***)

しかし、ここに当てはまりましたか?ありがとう、アンドレイ。

更新少し前にバグを報告しました。最近確認されました。参照: https ://bugs.launchpad.net/sbcl/+bug/936304

4

2 に答える 2

4

オブジェクトを参照するものがなくなったからといって、メモリが再利用されるわけではありません。ガベージコレクターは将来実行される予定であり、多くの場合、メモリ不足エラーが発生する前に実行されることが保証されます。

ここで発生する可能性のあるもう1つのことは、Lispプロセスのメモリ使用量を調べていることです。メモリがCGされると、通常、オペレーティングシステムには戻されません。代わりに、メモリはヒープ上で単に空きとしてマークされ、将来のメモリ割り当てで使用できます。

于 2012-02-18T17:07:39.963 に答える
1

SBCLのみ..。

(gc :full t)

これにより、すべての世代でガベージコレクションが強制的に開始されます。数日前にSBCLが大量のメモリを保持していることに気づき、これを使用してメモリを「真の」使用量に落としました。

次に、ensure-gcマクロを作成して、ごちゃごちゃした計算と実験をラップしました。覚えていれば、家に帰ったら貼り付けます...それは特別なことではありません。

于 2012-02-21T00:06:24.453 に答える