@ 2024 Novasell, Inc. All Rights Reserved. 4
Pythonのオブジェクトの構成
id …メモリアドレス
class …タイプ
refcount …GCで使われるもの
その他 value などなど
refcount …GCで使われるもの
すべてのオブジェクトは参照カウント(refcount)等を持っている
Advanced Python Mastery (course by @dabeaz) 2-48
Slide 5
Slide 5 text
@ 2024 Novasell, Inc. All Rights Reserved. 5
Python(標準実装のCPython)の参照カウントとは
GCの⼀種で、プログラム内のオブジェクトがいくつの強い参照を持つかを追跡
参照カウント - python.jp
カウントが0になる(不要になる)と、CやC++のように明⽰的にメモリを解放しなくても⾃動的に解放
Slide 6
Slide 6 text
@ 2024 Novasell, Inc. All Rights Reserved. 6
参照カウントの基本的な役割
オブジェクトの⽣存期間を管理し、不要になったメモリを効率的に解放
オブジェクト作成
Pythonでオブジェクトが作成されると、参照カウントは1になる
参照の追加‧削除
オブジェクトへの参照が増減するたびに、参照カウントもそれに応じて増減
参照カウントの監視
参照カウントが0になると、Pythonはそのオブジェクトを使⽤されていないと判断
メモリの解放
参照カウントが0のオブジェクトはメモリから解放され、その領域が再利⽤可能
連鎖的解放
オブジェクトが解放されると、それが参照した他のオブジェクトの参照カウントも減少し、連鎖的に解放
はじめに. オブジェクト、型および参照カウント — Python 3.10.13 ドキュメント
Slide 7
Slide 7 text
@ 2024 Novasell, Inc. All Rights Reserved. 7
参考: 参照カウントの操作(CPython)
はじめに. オブジェクト、型および参照カウント — Python 3.10.13 ドキュメント
Slide 8
Slide 8 text
@ 2024 Novasell, Inc. All Rights Reserved. 8
Pythonの参照カウントの位置付け
Pythonのメモリ管理
● ガベージコレクション (GC)
● 参照カウント
i. 概念: Pythonは各オブジェクトに対して参照数を追跡
ii. 効果: 参照が0になると、オブジェクトは⾃動的にメモリから削除
● Generational GC (世代別ガベージコレクション)
● メモリプール
● オブジェクト特有のアロケータ
● 動的メモリ管理
● アロケータのカスタマイズ
Slide 9
Slide 9 text
@ 2024 Novasell, Inc. All Rights Reserved. 9
Generational GC (世代別ガベージコレクション)
Python Garbage Collection: What It Is and How It Works
Generational GCの基本的な概念
● オブジェクトは作成されてからの経過時間に応じて「世代」に分類
● 新しいオブジェクトは「若い世代」に、時間が経つにつれて「古い世代」に移動
● 古い世代のオブジェクトは、ガベージコレクションのチェック頻度が低くなる
Slide 10
Slide 10 text
@ 2024 Novasell, Inc. All Rights Reserved. 10
Generational GC (世代別ガベージコレクション)
循環参照とは
● 循環参照は、2つ以上のオブジェクトが互いに参照し合う状態を指す
● このようなオブジェクト群は、参照カウントが0にならないため、
参照カウントによるGCでは解放されない
Python Garbage Collection: What It Is and How It Works
Slide 11
Slide 11 text
@ 2024 Novasell, Inc. All Rights Reserved. 11
Generational GC (世代別ガベージコレクション)
Generational GCの効果
● 循環参照を含むオブジェクト群を検出し、メモリから解放する
これにより、メモリリークのリスクを減らし、全体的なメモリ効率が向上
Python Garbage Collection: What It Is and How It Works
Slide 12
Slide 12 text
@ 2024 Novasell, Inc. All Rights Reserved. 12
Generational GC (世代別ガベージコレクション)
Slide 13
Slide 13 text
@ 2024 Novasell, Inc. All Rights Reserved. 13
PythonのGCによるメモリ管理のPros / Cons
Slide 14
Slide 14 text
@ 2024 Novasell, Inc. All Rights Reserved. 14
他の⾔語のメモリ(オブジェクト)管理: JavaScript
設計⽅針: 到達可能性
● 基本概念
● オブジェクトの⽣存は、その「到達可能性」によって決定される
● 「到達可能」オブジェクトは、直接または間接的に参照されているオブジェクトを指す
● 到達可能性の例
● グローバル変数や実⾏中の関数のローカル変数によって参照されるオブジェクトは「到達可能」
● これらのオブジェクトが他のオブジェクトを参照する場合、参照されたオブジェクトも「到達可能」
Memory management - JavaScript | MDN
Slide 15
Slide 15 text
@ 2024 Novasell, Inc. All Rights Reserved. 15
他の⾔語のメモリ(オブジェクト)管理: JavaScript
到達可能性の実装: (GC)の⼀種である「マーク‧アンド‧スイープ」アルゴリズム
● マークフェーズ: マーキング
● ガベージコレクタが⾃動的にルート集合(グローバル変数など)から開始し、
到達可能なオブジェクトにマークを付ける
● スイープフェーズ: メモリ解放
● マークされていないオブジェクト(到達不可能なオブジェクト)は⾃動的にメモリから削除
Memory management - JavaScript | MDN
Slide 16
Slide 16 text
@ 2024 Novasell, Inc. All Rights Reserved. 16
JavaScriptのメモリ(オブジェクト)管理: Pythonとの⽐較
Slide 17
Slide 17 text
@ 2024 Novasell, Inc. All Rights Reserved. 17
他の⾔語のメモリ(オブジェクト)管理: Rust
アナロジー的には、Rustは基本的に参照カウントが1以外を許さない言語設計。
各値が一つの変数に「所有される」という原則に基づく。
所有権 (Ownership)
● 各値は⼀つの変数に「所有」される
● 所有権は代⼊や関数呼び出しで移動する
● 値の所有者がスコープを抜けると、値は⾃動的に破棄される
借⽤ (Borrowing)
● 他の変数から値を「借⽤」して参照する
● 不変の借⽤(&T)では値を変更できず、複数同時に存在可能
● 可変の借⽤(&mut T)では値を変更でき、⼀度に⼀つのみ存在
Slide 18
Slide 18 text
@ 2024 Novasell, Inc. All Rights Reserved. 18
他の⾔語のメモリ(オブジェクト)管理: Rust
内部的な動作
● コンパイル時のチェック
○ Rustのコンパイラはコードをコンパイルする際に、
所有権のルールに基づいてメモリ安全性をチェックする
● ⾃動的なリソース解放
○ 所有者のスコープが終了すると、
Rustコンパイラは⾃動的にリソースを解放するコードを挿⼊する
Slide 19
Slide 19 text
@ 2024 Novasell, Inc. All Rights Reserved. 19
Rustのメモリ(オブジェクト)管理: Pythonとの⽐較
Slide 20
Slide 20 text
@ 2024 Novasell, Inc. All Rights Reserved. 20
メモリ管理の⾔語別早⾒表(ざっくりしています)
Slide 21
Slide 21 text
@ 2024 Novasell, Inc. All Rights Reserved. 21
参考
● Advanced Python Mastery
● 参照カウント - python.jp
● はじめに — Python 3.10.13 ドキュメント
● デザインと歴史 FAQ
● Python Garbage Collection: What It Is and How It Works
● Memory management - JavaScript | MDN
● Rustのメモリ管理って⾯⽩い
● What is Ownership? - The Rust Programming Language
Slide 22
Slide 22 text
@ 2024 Novasell, Inc. All Rights Reserved. 22
Thank you for listening !