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

3,617
-1

Published on

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

0 Comments
8 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,617
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
19
Comments
0
Likes
8
Embeds 0
No embeds

No notes for slide

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 />
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×