pythonのゴミ回収

1923 ワード

pythonでもjavaと同じようにゴミ収集の仕組みを採用していますが、pythonでは引用数のメカニズムがメインで、マーク-クリアとサブコレクションの2つのメカニズムを補助する戦略を採用しています。
一、参照カウントメカニズム:
pythonの中ですべてのものはすべて対象で、それらの核心は1つの構造体です。PyObject。
typedef struct_object {
    int ob_refcnt;
    struct_typeobject *ob_type;
} PyObject;
PyObjectは各オブジェクトに必要な内容です。refcntは参照としてカウントされます。オブジェクトが新しい参照があるときは、そのob_refcntは増加して、その対象を引用して削除される時、そのob_refcntは減少します。
参照を0と数えたら、その対象の生命は終了します。
参照カウントはリアルタイム性があります。参照がないとメモリはそのまま解放されます。他のメカニズムのように、特定のタイミングまで待つ必要はありません。リアルタイム性には、メモリを回収する時間を通常に割り当てるというメリットもあります。
しかし、循環参照に遭遇した場合は、次のようになります。
class Node:
    def __init__(self, val):
        self.val = val

n1 = Node("a")
n2 = node("b")

n1.next = n2
n2.prev = n1
n 1とn 2は相互参照であり、他のオブジェクトからの参照がなければ、n 1とn 2の参照カウントも依然として1であり、占有メモリは永遠に回収されない。
二、マーククリアとサブコレクション
上記の手順に続いて、私達の2つのノードは循環参照の方式で双方向チェーンテーブルを構成しています。このとき、aおよびbの参照カウント値は2に増加している。ここでは、2つのポインタが各ノードを指しています。まず、n 1およびn 2、次はnextおよびprevです。
私たちのプログラムはもうこの二つのノードを使わないと仮定して、n 1とn 2をnullに設定します。このとき、各ノードの参照カウントは1に減少する。
1、Python中の隔世回収
Pythonは、アクティブなオブジェクトを追跡するために異なるチェーンを使用して、Pythonの内部Cコードをゼロ世代と呼びます。
オブジェクトを作成するたびに、Pythonはゼロチェーンに加入します。一定の閾値に達すると、python解釈器は、ゼロチェーン上のすべてのオブジェクトの参照をカウントダウンし、生き残ったオブジェクトを一世代チェーン上に移す。ゼロ世代チェーンが一定回数まで整理されると、一世代チェーン上のすべてのオブジェクトの参照はカウントダウンし、生存しているオブジェクトは二世代チェーン上に移動します。一世代のチェーンが一定の回数まで整理されると、二世代チェーン上のすべてのオブジェクトの参照カウントが1つ減少します。
ゴミ収集の頻度は「代」の生存時間の増加とともに減少しています。つまり、長く生きている対象ほど、ゴミではありません。