Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Pythonのガベージコレクション<br />Atsuo Ishimoto<br />AXISSOFT<br />Python Hackathon 2011/2/19<br />
PythonのGC<br />参照カウント<br />マーク & スイープ<br />
参照カウント<br />>>> A = CLS()<br />>>> A.B = CLS()<br />>>> A.C = CLS()<br />>>> A.B.D = CLS()<br />>>> A.B.D.C = A.C<br />>>>...
循環参照<br />Pythonインタープリタ<br />A<br />A<br />Refcount=1<br />Refcount=2<br />B<br />B<br />E<br />E<br />Refcount=1<br />Ref...
マーク&スイープ<br />到達不能なオブジェクトを検出<br />世代別<br />できたてのオブジェクトは死にやすい<br />長生きのオブジェクトはなかなか削除されない<br />3世代に分けて、若いオブジェクトを重点的にチェック<br />
GCの処理時間<br />
GCあるある<br />gc.garbageがゴミであふれる<br />__del__()は悪<br />意図しない循環参照<br />ログ用にトレースバック情報を貯めていたり<br />使いかけのジェネレータを放置したり<br />def g...
GCあるある<br />大量のオブジェクトを生成するとやけに遅い<br />若い世代のオブジェクトが大量に作られるため、GCの負荷が高い<br />gc.disable()で一時的にGCを停止<br />2.7/3.2で改善<br />
GCあるある<br />gc.disable()したのに別スレッドでgc.enable()されてる<br />スレッドB<br />スレッドA<br />gc.disable()<br />gc.disable()<br />gc.enable...
GCあるある<br />知らないスレッドで__del__()が動いてる<br />スレッドA<br />スレッドB<br />オブジェクト作成<br />GC発生<br />オブジェクト解放<br />
Upcoming SlideShare
Loading in …5
×

Pythonのガベージコレクション

6,091 views

Published on

Presentation at Python Hack-a-thon 2011/2/19

Pythonのガベージコレクション

  1. 1. Pythonのガベージコレクション<br />Atsuo Ishimoto<br />AXISSOFT<br />Python Hackathon 2011/2/19<br />
  2. 2. PythonのGC<br />参照カウント<br />マーク & スイープ<br />
  3. 3. 参照カウント<br />>>> A = CLS()<br />>>> A.B = CLS()<br />>>> A.C = CLS()<br />>>> A.B.D = CLS()<br />>>> A.B.D.C = A.C<br />>>> A.C.E = CLS()<br />Pythonインタープリタ<br />A<br />B<br />Refcount=1<br />Refcount=1<br />C<br />D<br />Refcount=1<br />Refcount=2<br />E<br />Refcount=1<br />
  4. 4. 循環参照<br />Pythonインタープリタ<br />A<br />A<br />Refcount=1<br />Refcount=2<br />B<br />B<br />E<br />E<br />Refcount=1<br />Refcount=1<br />Refcount=1<br />Refcount=1<br />Refcount=1<br />Refcount=1<br />Refcount=1<br />Refcount=1<br />C<br />D<br />C<br />D<br />
  5. 5. マーク&スイープ<br />到達不能なオブジェクトを検出<br />世代別<br />できたてのオブジェクトは死にやすい<br />長生きのオブジェクトはなかなか削除されない<br />3世代に分けて、若いオブジェクトを重点的にチェック<br />
  6. 6. GCの処理時間<br />
  7. 7. GCあるある<br />gc.garbageがゴミであふれる<br />__del__()は悪<br />意図しない循環参照<br />ログ用にトレースバック情報を貯めていたり<br />使いかけのジェネレータを放置したり<br />def gen():<br /> try:<br /> yield 1<br /> yield 2<br /> finally:<br /> …<br />g = gen()<br />g.next()<br />…<br />
  8. 8. GCあるある<br />大量のオブジェクトを生成するとやけに遅い<br />若い世代のオブジェクトが大量に作られるため、GCの負荷が高い<br />gc.disable()で一時的にGCを停止<br />2.7/3.2で改善<br />
  9. 9. GCあるある<br />gc.disable()したのに別スレッドでgc.enable()されてる<br />スレッドB<br />スレッドA<br />gc.disable()<br />gc.disable()<br />gc.enable()<br />…<br />gc.enable()<br />
  10. 10. GCあるある<br />知らないスレッドで__del__()が動いてる<br />スレッドA<br />スレッドB<br />オブジェクト作成<br />GC発生<br />オブジェクト解放<br />

×