4

gc.get_referrers(obj) がオブジェクトの空のリストを返すことは可能である必要がありますが、オブジェクトは引き続き弱い参照を介してアクセスできますか?

もしそうなら、このオブジェクトがガベージコレクションされていない原因を特定するにはどうすればよいでしょうか?

編集:この場合、コードサンプルがどのように役立つか正確にはわかりません-明らかに強力な参照がどこかにありますが、それを見つけることができれば気が遠くなります. オブジェクトへの強い参照はすべて get_referrers() によって識別されるという印象を受けました。

編集:解決済み。強い参照を持つ変数を見つけました - それはゲーム イベント ループ内にありましたが、クラス変数ではなかったため、get_referrers はそれを取得していませんでした。

4

5 に答える 5

1

はい:http ://docs.python.org/library/weakref.html

弱参照はオブジェクトを存続させません。

get_referrers()関数は、ガベージコレクションをサポートするコンテナのみを検索します。他のオブジェクトを参照しているがガベージコレクションをサポートしていない拡張タイプは見つかりません。

オブジェクトが収集されていないと思われる理由は何ですか?また、gc.collect()を試しましたか?

于 2009-07-14T20:32:51.293 に答える
1

最初の質問とは関係なく、問題を発見できてよかったです。それにもかかわらず、他の人が問題を抱えている場合に備えて、後世の答えについて私は別の見方をしています.

オブジェクトがリファラーを持たず、ガベージ コレクトされないことは合法です。

Python 2.7 マニュアルから: 「実装では、ガベージ コレクションを延期したり、完全に省略したりできます。まだ到達可能なオブジェクトが収集されない限り、ガベージ コレクションがどのように実装されるかは、実装の品質の問題です。」

NO-OP ガベージ コレクタは合法です。

世代別および参照カウントのガベージ コレクターに関する議論は、特定の CPython 実装を参照しています (質問でタグ付けされています)。

于 2010-11-04T03:26:36.830 に答える
0

Christopher が言うように、弱い参照はオブジェクトの refcount にカウントされないため、Python がオブジェクトを削除しないようにすることはできません。

__del__ただし、Python のガベージ コレクターは、循環参照にあり、メソッドが定義されているオブジェクトを削除しません。gc.garbage
を使用して、このような状況を確認 (および修正) できます。

于 2009-07-14T20:38:33.637 に答える
0

オブジェクトへの強い参照がある場合は、gc.get_referrers(obj) を使用してそれを見つけます。

これは、リークがあり、何がリークしているのかわからない場合に役立ちます。

http://mg.pov.lt/objgraph.py http://mg.pov.lt/blog/hunting-python-memleaks http://mg.pov.lt/blog/python-object-graphs.html

これは、inspect モジュールの薄いラッパーです。不要な参照を追跡するのが難しい場合は、非常に役立ちます。ただし、参照を追跡するだけであれば、おそらく gc.get_referrers だけで十分です。

于 2009-07-14T21:06:00.650 に答える