2012-02-18 11 views
3

REPLのSBCLガベージコレクタの次の動作に多少なりとも戸惑います。私は何ももう元の配列を参照していないことを期待するSBCLのREPLのメモリリーク

(add-one (test-gc)) 

を実行し

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

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

:二つの機能を定義します。しかし、(部屋の)報告書によると、記憶は解放されない。私は(テスト-GC)を実行した場合、直接、その後、いくつかの参照はSLIMEや

(list * ** ***) 

のどこかに立ち往生されている可能性が、理解していたが、ここでの場合であるのでしょうか?ありがとう、アンドレイ。

更新しばらく前に私はバグを提出しました。最近確認された。参照してください: https://bugs.launchpad.net/sbcl/+bug/936304

+0

この質問をSBCLメーリングリスト –

+0

で聞いて、返信のフォローアップを投稿してください。ところで、なぜ問題のタイトルに「クロージャー」がありますか?私は質問のコードにクロージャーが表示されません。 –

+1

CLISPで同じコードを試しましたが問題はありません。 gitバージョンのSBCLにはまだこの問題があるので、バグレポート(https://bugs.launchpad.net/sbcl/+bug/936304)を提出しました。クロージャーの発言についてはクロージャーがありません:) – Andrei

答えて

4

オブジェクトをもう何も参照しても、メモリが再利用されるわけではありません。ガベージコレクタは、将来はいつか実行され、しばしばメモリ不足エラーが発生する前に実行されるという唯一の保証があります。

ここで起こりうる別のことは、Lispプロセスのメモリ使用量を見ていることです。メモリがCG'edの場合、通常はオペレーティングシステムに返されません。代わりに、メモリは単にヒープ上で空きとしてマークされ、将来のメモリ割り当てで使用できます。

+2

有効なポイントは、私はそれを考えなかった。そこで私はさらにテストを行いました: '(add-one(test-gc))'を数回評価しました。いずれかのポイントが有効な場合、私は決してメモリが足りなくなってはいけません。しかし、いくつかの評価の後、私は「ヒープが疲れました」を得ました。したがって、メモリが解放されたり再利用されているようには見えません。 – Andrei

+0

この問題はLinuxのSBCL 1.0.53では表示されません –

+0

面白いです。私は1.0.54を使用しました。私はちょうど1.0.53を試しましたが、私はまだエラーを受け取ります(Linuxでも)。エラーがgitバージョンでも発生しない場合は、(https://bugs.launchpad.net/sbcl/+bug/936304)で共有することを検討してください。 – Andrei

1

SBCLだけ...

(gc :full t)

これは、強制的にすべての世代間でガベージコレクションをキックオフします。私はSBCLが数日前に1トンのメモリを保持していたことに気付き、これを使用してメモリを「真の」使用に落としました。

私はgarbagey計算&実験のものを包むために、確実なgcマクロを書きました。私が覚えていれば私が帰宅したらそれを貼り付けます。

+0

強制ガーベッジコレクションが動作しますが、(add-one(test-gc)を複数回評価した後にのみ)。面白い。 – Andrei

+0

@Andrei:私は渡さなければならなかった:それがすべての世代を通過することを保証するために完全な。 –