2009-07-14 14 views
3

gc.get_referrers(obj)はオブジェクトの空のリストを返すことができますが、オブジェクトはまだ弱い参照でアクセス可能なはずですか?Pythonオブジェクトには参照元はありませんが、weakrefを介してアクセスできますか?

もし私がこのオブジェクトがガベージコレクションされていない原因を特定しようとすると、どうすれば開始できますか?

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

編集:解決済み。変数を見つけました。それはゲームのイベントループの中にありましたが、クラス変数ではありませんでしたので、get_referrersはそれを選択しませんでした。

+0

(質問にタグ付けされるように)特定のCPythonの実装を参照している単純なコードの例を与えてください。それ以外の場合は、あなたが意味するものは明確ではありません。弱参照自体がアクセス可能であるか、弱参照を介してアクセス可能な参照オブジェクト自体であるか? – yairchu

+0

どのように参照変数を見つけましたか?私はちょうどそのようなリークを追跡しようとしていますが、間欠的で、gc.get_referrersが[]を返しています。オブジェクトへの「ローカル」参照がどこにあるかを見つける方法はありますか? – papercrane

答えて

1

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

弱参照は、生きているオブジェクトを保持することはできません。

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

あなたはオブジェクトが収集されないと思いますか?また、gc.collect()を試してみましたか?

+0

私はweakrefを使ってオブジェクトインスタンスを取得しますが、Noneを期待しています。 –

+1

他に強い参照がないことは確かですか?また、ガベージコレクションは自動ではありません(参照カウントがあっても、別のガベージコレクションアルゴリズムが使用されるまで待機する参照サイクルがある場合) –

+0

はい、どれくらいですか?永遠に?つまり、プログラムを長時間実行したままにしておけば、オブジェクトは決して収集されません。 PythonのGCは世代別であるため、オブジェクトが収集されるまでに時間がかかることがあります。 – Christopher

0

Christopher saysとして、弱参照はオブジェクトrefcountに数えられません。したがって、Pythonがオブジェクトを削除しないようにすることはできません。

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

+0

gc.garbageはgc.collect()を呼び出した後の空のリストです。オブジェクトもスーパークラスも__del__を定義していません。循環参照は、gc.get_referrers()によって返されたリストによって識別できますか? –

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

それは検査モジュールの周りの薄いラッパーです。不要な参照を追跡するのが難しい場合は、多くの手助けをすることができます。しかし、参照を追跡するだけでは、おそらくgc.get_referrersだけで十分でしょう。

1

バグのあるC拡張で参照がリークされた場合もありますが、IMHOではリファラーは表示されませんが、refcountは0にはなりません。戻り値sys.getrefcount

1

最初の質問とは無関係に問題を発見してうれしいです。それにもかかわらず、他の人に問題がある場合に備えて、私は後世の答えに違った立場を取っています。

オブジェクトが参照元を持たず、ガベージコレクションされていないことは正当です。

Python 2より。手動でガベージコレクションを延期することも、それを省略することもできます。ガベージコレクションの実装方法については、到達可能なオブジェクトが収集されない限り、実装品質の問題です。

NO-OPガベージコレクタは正当です。世代と基準カウントガベージコレクタ約

議論は

関連する問題