[Pythonのガベージコレクション] --2019-08-07十時12分51秒

オリジナル:http://106.13.73.98/__/26/

PythonのGCモジュールは、主に使用して参照カウント追跡し、廃棄物を回収するために(参照カウントを)。参照カウントに基づいて、あなたもできるマーク-明確な(マークアンドスイープ)コンテナオブジェクトは、循環参照の問題が発生する可能性のある解決します。世代の回復、さらにガベージコレクションの効率(生成コレクション)時間のためのスペースを改善します。

@
___

参照カウント

Pythonでは、ほとんどのオブジェクトのライフサイクルは、管理するために、参照カウントを通じてオブジェクトです。大まかに言えば、参照カウントはまた、ガベージコレクションのメカニズムですが、また、最も直感的で簡単なガベージコレクションの数の一つ。

原則の参照カウント:

  1. 参照が作成またはオブジェクトをコピーすると、オブジェクトの参照カウントがインクリメントされます。
  2. オブジェクトへの参照が破棄されるとき、1によって、オブジェクトの参照カウント。
  3. オブジェクトの参照カウントが0の場合、そのオブジェクトがもはやメモリを解放するために、使用されることを意味しません。

    クラスがありA、次の操作かどうかを確認し、:

    class A:
        def __init__(self):
            print('初始化完成')
    
        def __del__(self):
            print('使命完成,我去也')
    
    
    a1 = A()
    a2 = a1
    a3 = a1
    
    
    del a1
    print('删除a1')
    
    del a2
    print('删除a2')
    
    del a3
    print('删除a3')
    
    
    print('代码执行结束')
    
    
    """
    打印顺序为:
        初始化完成
        删除a1
        删除a2
        使命完成,我去也
        删除a3
        代码执行结束
    """

            まず、私たちが作成するAオブジェクトのクラスを:a1と割り当て実行することで定義されたa2中で、a3彼らは共通のメモリアドレス、プロの説明を指している場合:Aクラスのオブジェクト数への参照を3です。その後、実行del、キーワードをオブジェクト参照が0である場合、オブジェクトのみが取り消されたの参照を削除し、これは、Python参照カウントガベージコレクション機構です。

参照が最大の利点を数える-リアルタイムに:
        参照カウントが参照カウント管理たびに割り当てるアクションと空きメモリを追加する必要がありますが、他の主流のガベージコレクションの数に比べて、参照カウントが最大の利点があり、 「リアルタイム」。それ それへの参照がありません一度任意のメモリは、それがすぐに回復されます。一方、他のガベージコレクションのメカニズムは、無効なメモリ回復する(メモリ割り当ての失敗でなければなりません)は、特定の特別な条件の下で満たさなければなりません。

実行効率の参照カウント:
        Pythonランタイムで行う追加のメモリ割り当て操作の参照カウント機構カウントの維持を参照し、放出および引用割り当ては正比例します。「 -スイープマーク」、「停止-コピー」、この点は以下のような、他の主流のガベージコレクション機構に比べて、それが弱点です。これらの技術の追加の操作を実質的にメモリの量に関係しているため回収されます。

参考アキレス腱を数える-循環参照を:
        効率が根は残念ながら、その後、弱さのちょうど参照カウント機構である場合には、参照カウントメカニズム致命的な弱点は、正確にはこのような弱点があり、そのように狭いガベージコレクションこれは致命的な弱点につながることができます含まれません参照カウントは、(また、相互参照など)、循環参照です。

いわゆる循環参照:

        循環参照は、オブジェクトの参照カウントのグループにすることができるが、これらのオブジェクトは、実際に任意の参照される外部オブジェクトではありません、彼らは相互にのみ参照され、0ではありません。これは、一部の人々は、オブジェクトのこのグループを使用しないことを意味し、オブジェクトによって占有されていたメモリ領域を解放し、その後による各オブジェクトの参照カウントが存在するために、相互に参照する必要があり、このグループはゼロではないので、これらのオブジェクトはメモリを占有したことがありませんこれはリリースされます。

>>> a = []
>>> b = [a]
>>> a.append(b)
>>> print(a)
[[[...]]]

これは、メモリリークメモリ管理によって生成された、致命的であり、手動と変わりません。この問題を解決するために、Pythonはカウントを参照不足を補うために他のガベージコレクションメカニズムを導入しました: - 「世代回復」「マークをクリア」、

マーク - クリア

「マーク - スイープは」循環参照の問題を解決することです。循環参照を生成することができる。また、他の(リスト、セット、辞書、クラス、インスタンスなど)コンテナオブジェクト内のオブジェクトへの参照を含んでいてもよいです。

        我々は2つのオブジェクトがカウントは1であるが、それらの間の循環参照の単なる存在で参照している場合、2つのオブジェクトが復元されることになるという事実を認識しなければならない、つまり、その参照は、非パフォーマンスを数えます0が、実際に効果的な参照カウントがゼロになります。我々は、これら2つのオブジェクトがそれから出てくるの有効回数、第一の基準サイクルを脱ぐ必要があります。A、同様に、AのBへの参照があるため、基準到着に沿って、次にBと、我々はそれが参照のペアを持っているので、基準カウントB 1、A、Bから進む2つのオブジェクトA、Bを考えますリファレンスマイナス1;これは、除去対象ループ参照を完了します。

        しかし、このような問題は、Aは、オブジェクト参照Cを持ち、かつCカウンタが1ずつ減少し、最後にAが回収されていない、それは我々がエラーが、1によるCの参照カウントであろうことは明らかであるされている場合、Cは、Aを参照していない、そのオブジェクトを想定しますCさんへのダングリング参照してきたいくつかの将来の瞬間につながります。これは、このような方式の使用を通じてとして、参照カウントが削除されていないAの場合にCを回復するために私たちを必要とし、参照カウントを維持する複雑さが倍増します。

マークは-明確な原則:
        -より良い方法で「マークスイープ」、我々は実際の参照カウントを変更しないが、コレクション内の参照カウントオブジェクトは、参照されたオブジェクトの変更のコピーをコピーを作成します。行われた変更のコピーのために、保守対象のライフサイクルには影響しません。
        唯一の効果は、コピー回数は見つけることであるルートオブジェクトセット(リサイクルできないオブジェクトのセットを)。成功裏に見た場合、ルート・オブジェクトのコレクションの後、第一の記憶は今、二つのリストにして維持されるリスト分割されたルートオブジェクト、コレクションになるルート他は残りのオブジェクトになるのリストを維持しながら、リスト到達不能リストを。そのような考察に基づいてPoucheng二つのリストの理由:今すぐ到達不能存在する可能性のあるオブジェクトのリンクリストされているルート直接的または間接的に参照されるリストのオブジェクトは、これらのオブジェクトは、タグのプロセス後、回復することはできませんそのようなオブジェクトは、それからなり見出さ到達不能ムーブリストルートリスト、完了フラグの後に、到達不能な全ての残りのオブジェクトのリストが真ガーベッジオブジェクトであり、次のガベージコレクションだけに制限されて到達不能リストそれはすることができます。

世代回復

        背景:どんなにどのような言語にかかわらず、開発のどのようなタイプの、任意のプログラムの規模を開発するために使用しないために:世代別ガベージコレクション技術は前世紀の80年代に開発されたガベージコレクションメカニズムであり、一連の研究があることを示しました、共通でそうほとんどありません。すなわち:メモリブロックよりも短い申告期間の一定割合、機械語命令の通常時の何百万、メモリのブロックの残りの間、長いライフサイクル、でも最初からプログラムへのプログラムの終了まで。

        前方から-メモリのブロックの数を回収する必要がある場合、そのようなガベージコレクション機構をもたらすガベージコレクション「フラグクリア」ビュー、このような追加の操作など、実際のシステムにおけるメモリブロックの総数は、長い間、関連付けられていますより多くのスパム検出は、追加の操作、追加の操作や持参少ないガベージコレクションをもたらします。リカバリするメモリブロックが小さい場合は逆に、追加の操作を検出するゴミがガベージコレクション以上のものを持参します。使用して、ガベージコレクションの効率を改善するための時間のための戦術スペースを

世代回復原理:
        異なるセットに分割その還元生存に係る生存期間の「世代」として全てのメモリブロックが増加するためのシステムであって、各セットは、「世代」、ガベージコレクションの頻度となります。言い換えれば、ライブオブジェクトの時間は長く、それはゴミである可能性が低い、それにガベージコレクションの頻度を減らす必要があります。それでは、どのオブジェクトが合格した場合、ガベージコレクションの数を、それの生存時間を測定する通常測定するために、いくつかのガベージコレクションのアクションを使用し、それ以上にして描画することができます。オブジェクト長く生存時間を。

オリジナル:http://106.13.73.98/__/26/

おすすめ

転載: www.cnblogs.com/gqy02/p/11313566.html