2.pythonベース - ガベージコレクション

1.メモリ管理:

  ▪変数の事前の宣言なしのpythonは、およびタイプを指定する必要はありません。

  ▪メモリのその占有を気にせず、変数の使用前と後があるかどうかを気にせずにパイソン。

  オブジェクトが自動的に回復されたときにPythonが役に立たないと考えられ▪Pythonのガベージコレクション機構。

ガベージコレクション(GC)の2.python:

  スイープと二つのメカニズムによって補完世代戦略を収集 - Pythonはすべての各々は、ガベージコレクションのために、Pythonは参照カウンタベースのシステム、マークを使用して、オブジェクトです。

  参照カウント:

  参照カウントの原則は、各オブジェクトは、このオブジェクトにどのように多くの参照を追跡するために最終的に、つまり、現在のオブジェクトが参照された回数を記録するために使用ob_refを、維持することです。

  参照カウントが0であるときは、そのオブジェクトによって占められるメモリはPythonの仮想マシンを破壊されます。

  +1カウンター引用:

    ▪オブジェクトが作成されます。a = 1

    オブジェクトが参照される:= A bは

    関数に渡されるパラメータとしてオブジェクト、:DEFテスト(A)

    パラメータとしてオブジェクトは、コンテナに格納されます。リスト= { "A "、 "B"、2}

  の場合の参照カウンタ1:

    別名オブジェクトが明示的に破棄されます。del A

     = 2:別名オブジェクトは、新しいオブジェクトを与えています

    オブジェクトがスコープの外に出る。例えば、試験(a)は、関数が完了し、参照カウンタの関数内のローカル変数がデクリメントされる(ただし、グローバル変数)

      要素は、容器から除去され、又は容器が破壊されます。

  参照カウントは、リソースの消費量の参照カウントを維持し、引用循環の問題を解決することはできません。循環参照の問題は何ですか?A及びBは、AとBのいずれかに互いにない外部参照を参照し、その参照カウントが1であり、回収されなければならないことは明らかです。(リスト1 = []、LIST2 = []、list1.append(LIST2)、list2.append(LIST1)、そのカウント値が1になるようにコンプライアンスLIST1とLIST2は、カウントを増加しないので、それらは、それぞれ円形の参照。)

  これら二つのメカニズムのスイープと世代別GCの回復を - これらの欠点、Pythonとマークを使用するに対処するために。

  マーク - クリア:

  たぶん、これらのオブジェクトを解放し、彼らが占有するメモリ領域を解放する方法のpython、あなたのコードは、循環参照の場合には、誤ってキャッチされ、これらのオブジェクトは、外部参照を持っていない、またはプログラムは、これらのオブジェクトは必要ありません。

  クリアマークは(マーク・スイープ)アルゴリズムが回復軌道(トレースGC)のガベージコレクションのアルゴリズム技術に基づいています。これは、2つの段階に分けられる:第一段階がマークされ、GCは、第二段階は、リサイクルのために、「非アクティブなオブジェクトを」マークされていないオブジェクトのマークをブランドのすべての「アクティブなオブジェクト」であるだろう。その後、GCは、非アクティブなオブジェクトですアクティブなオブジェクトであるものを決定する方法ですか?有向グラフを形成するために一緒に参照(ポインタ)によってオブジェクト間、この構成は、グラフのノードへのオブジェクト、及び図の参照側とその関係を有します。ルートオブジェクト(ルートオブジェクト)出発からは、アクティブなオブジェクトの到達可能な(到達可能な)オブジェクトは、側にトラバースオブジェクトに沿ってそこにマークされ、非アクティブオブジェクトに到達不能オブジェクトがクリアされます。ルートオブジェクトは、グローバル変数、コールスタック、レジスタです。

                                                                        

  示されているように、我々は、小さな黒丸としてルートオブジェクトから出発し、それをグローバル変数として黒丸を入れ、オブジェクト1への直接アクセス、それがマークされ、オブジェクトは、間接的に2,3に到達するであろう図4および図5は、アップないながらマークは、アクティブオブジェクトは、1,2,3、4と5は、GCを回収する非アクティブオブジェクトです。

  文字列のため、数字のオブジェクトが循環参照の問題を引き起こすことはほとんどありませんので、Pythonの技術としてクリアマーカー支援ガベージコレクションアルゴリズムは、などのリスト、辞書、タプル、例えば、として、主処理コンテナオブジェクトの一部です。Pythonは整理これらのコンテナオブジェクトの二重リンクリストを使用しています。しかし、このシンプルで、粗マークスイープアルゴリズムは、重大な欠点を持っている:それはアクティブなオブジェクトの小さな部分だけでも、すべてのオブジェクトをスキャンしても、停止中のオブジェクトをクリアする前に全体のヒープメモリの順序をスキャンする必要があります。

  パイソンと呼ばれるアクティブなオブジェクトを追跡するためのリンクリストの使用になります「リストのゼロ代わって。」たびに、あなたは、オブジェクトやPythonは、リストのゼロ代わっに追加されます、値の何か他のものを作成します。マーク-循環参照の問題を解決する方法を掃引します。コンテナオブジェクトは、アプリケーションメモリの時のための循環参照を生成する可能性がある他のオブジェクトへの参照を含むことができ、(例えば、リスト、辞書、セット、あるいはクラスとして)、全てのコンテナオブジェクトの頭部は、「マークを達成するためにPyGC_Headを追加しました-クリア「メカニズム。PyObject_HEAD +データ・オブジェクト自体の2つの部分に分け、任意のオブジェクトのPython。

  ゼロ、置換のリスト上の各オブジェクトを介してPythonの意志周期規則に従って相互に参照されるそれぞれの検査対象リストは、その参照カウントを失いますこのプロセスでは、オブジェクトの早期放出を防止するためのPythonの参照の1つによって内部的に統計の数。

  多くの異なるオブジェクトがゼロ世代のリストの内側に配置され、これらのオブジェクトのいくつかは、コレクタが放出され得ることを意味する、ゼロ世代数のリストで参照されるいくつかのオブジェクトがゼロになると、リストの外、他のオブジェクトによって参照されます彼らとメモリ空間の回復。世代リスト:残りのアクティブなオブジェクトが新しいリストに移動しました。

  プログラムを実行すると、Pythonインタプリタは、新しく作成されたオブジェクトを保持し、参照カウントがゼロに解放されたオブジェクトであるため、追跡します。新しいプログラムの各オブジェクトは、最終的に解放されなければならないので、理論的には、これらの2つの値は、同じでなければなりません。(ここではそれを理解するには?Nオブジェクトが作成され、新たに作成されたレコードnのオブジェクトのPythonインタプリタの数、および理論的には、このn個のオブジェクトが最終的に解放されますカウントがゼロなので、Pythonインタプリタレコードが解放されますオブジェクトの数がnです。)

  しかし、循環参照の、とカウント値とオブジェクトの割り当てのカウント値との差が成長するようになりましオブジェクト内の他のオブジェクトが存在するよりも、いくつかの時間を使用するプログラムとしてリリースされます。蓄積された差が一定のしきい値を超えると、Pythonは「浮遊ごみ」の収集機構のリリースを開始し、残りのオブジェクトは、リストの世代に移動します。

  時間が経つにつれて、プログラムは、オブジェクトが徐々にリスト生成にリストのゼロ世代から移動して使用しています。Pythonオブジェクトは同じ方法に従うため、一度割り当てられたカウント値とカウント値が一定のしきい値に達し解放蓄積され、リスト生成処理、パイソンの残りの部分は、アクティブリストIIにオブジェクトを移動します。

  このように、オブジェクトコードの長期使用は、あなたのコードで、これらのアクティブなオブジェクトがゼロから転送されるリストに代わって、へのアクセスを継続し、その後の世代に第二世代に移しました。異なる閾値を設定することにより、これらのオブジェクトとPythonは異なる時間に間隔を置いて配置されてもよいです。最も頻繁に代わってPythonのゼロ処理は、世代が続き、第二世代です。

  世代の回復:

  次のようにGC論理的なプロセスは、次のとおりです。

  

 

 

   、Pythonの生存時間は、オブジェクトメモリーに応じた動作の時間モードの世代の空間を回復は、異なるセットに3「世代」に代用、Pythonのメモリとして知られている各セットに分割され、それぞれ、若い世代(継代0)、年(第一世代)、歳(第2世代)は、その位置は、彼らの生存期間、ガベージコレクションの対象周波数が高くなる3つのリストです。新しく作成されたオブジェクトは、若い世代に割り当てられ、リストの若い世代の合計数が上限に達し、Pythonのガベージコレクション機構がトリガされ、これらのオブジェクトは、リサイクルをリサイクルすることができ、それらのオブジェクトが回収されていない移動され年間で行く、というように、オブジェクトの古い時代には、オブジェクトの最長生存期間である、あるいはシステムのライフサイクルで生き残るために。同時に、世代回復が明確なラベリング技術基盤の上に構築されています。これらのPythonのコンテナオブジェクトの処理の補助として同じ世代別ガベージコレクション技術を回収します。

免責事項:からの記事の内容のほとんどはhttps://blog.csdn.net/xiongchengluo1129/article/details/80462651

 

  

 

おすすめ

転載: www.cnblogs.com/linfengs/p/11543699.html