7

重複の可能性:
Python:コードが原因でPythonで実際のメモリリークが発生する可能性はありますか?

Pythonガベージコレクターは循環参照(オブジェクトAがオブジェクトBを参照し、オブジェクトBがオブジェクトAを参照)の検出を処理するため、Pythonコードでメモリリークが発生する原因は何でしょうか。ガベージコレクターが処理できなかった、またはそのようなことは不可能な、アクセスできないメモリ領域を作成するコードの具体例を提供できますか?

どんな例でもありがたいです!

4

1 に答える 1

4

gc —ガベージコレクタインターフェイスモジュールを使用でき ます。

gc.garbage

コレクターが到達不能であることが判明したが解放できなかったオブジェクトのリスト(収集不可能なオブジェクト)。デフォルトでは、このリストには__del__()メソッドを持つオブジェクトのみが含まれます。[1]メソッドがあり、参照サイクルの一部である オブジェクト__del__()は、必ずしもサイクル内にあるとは限らないが、そこからのみ到達可能なオブジェクトを含め、参照サイクル全体を収集できなくなります。一般に、Pythonが実行する安全な順序を推測することはできないため、Pythonはそのようなサイクルを自動的に収集しません。 __del__()メソッド。安全な順序がわかっている場合は、ガベージリストを調べ、リスト内のオブジェクトが原因でサイクルを明示的に中断することで、問題を強制できます。これらのオブジェクトは、ガベージリストに含まれているために存続しているため、ガベージからも削除する必要があることに注意してください。たとえば、サイクルを中断した後del gc.garbage[:]、リストを空にします。一般に、。を含むオブジェクトを含むサイクルを作成しないことで、この問題を回避することをお勧めし__del__()ます。その場合、メソッドとガベージを調べて、そのようなサイクルが作成されていないことを確認できます。

于 2012-11-17T22:52:50.523 に答える