ガベージコレクションの修正再表示

ガベージコレクションの修正再表示

すでにガベージコレクションのメカニズムの話の前に参照カウントが0である、つまり、インタプリタは、変数の値が、参照カウントメカニズムを回復する、致命的な弱点が残っています、それはまた、相互参照として知られている循環参照、です。

# 如下我们定义了两个列表,简称列表1与列表2,变量名l1指向列表1,变量名l2指向列表2
>>> l1=['xxx'] # 列表1被引用一次,列表1的引用计数变为1
>>> l2=['yyy'] # 列表2被引用一次,列表2的引用计数变为1
>>> l1.append(l2) # 把列表2追加到l1中作为第二个元素,列表2的引用计数变为2
>>> l2.append(l1) # 把列表1追加到l2中作为第二个元素,列表1的引用计数变为2
# l1与l2之间有相互引用
# l1 = ['xxx'的内存地址,列表2的内存地址]
# l2 = ['yyy'的内存地址,列表1的内存地址]
>>> l1
['xxx', ['yyy', [...]]]
>>> l2
['yyy', ['xxx', [...]]]
>>> l1[1][1][0]
'xxx'

循環参照につながる:値は、もはや任意の名前に関連付けられているが、基準値とリサイクルされなければならないではなく、0としてカウントされません
それは何を意味し、リサイクルしますか?想像して、以下の操作を参照してください

>>> del l1 # 列表1的引用计数减1,列表1的引用计数变为1
>>> del l2 # 列表2的引用计数减1,列表2的引用计数变为1

この場合、唯一のlist 1レファは互いにリスト間には、二つの基準カウントのリストは0ではなく、リストは、二つではない
ので、より長い任意の他のオブジェクトに関連付けること、次いで、誰がそれらを参照することができませんバックべきであるタリアは、メモリスペースを取る
閉じるために、しかしための相互参照の、それぞれのオブジェクトの参照カウントがゼロではないので、メモリによって占有され、これらのオブジェクトが
解放されることはありませんので、循環参照は致命的であり、この手動メモリリークメモリ管理領域には生じない
他の。
したがって、Pythonの「マーク-クリア」の導入参照カウント循環参照の問題を解決し、「世代の回復は」非効率的です

マーク - クリア

コンテナ(例:リスト、セット、辞書、クラスオブジェクト 、インスタンス)がそうであり、他のオブジェクトへの参照を含むことができ
、循環参照を生成する可能性が高いです。「マーク-スイープは」循環参照の問題を解決するためにカウントされます。
ヒープ領域と:アルゴリズムをマークする前に、我々は変数に関する情報を格納することが明らかである必要は明確な理解、記憶、二つの領域が存在する
スタック領域、変数の定義、スタック領域に格納された値のメモリアドレスを持つ変数名協会、変数は、値がヒープに格納され、
メモリ管理は、スタック領域、以下の詳細図の内容の回復です。

二つの変数のX = 10、Y = 20定義

IMG

次のように我々は、x = yで、スタック領域とヒープ領域変化メモリを実行したとき

IMG

マーク/クリアアルゴリズムが適用可能なメモリ空間を使い切った場合、それは全体のプログラムを停止します練習で、その後、
2つのことを行い、最初はマークされ、二つ目は明らかです

#1、标记
标记的过程其实就是,遍历所有的GC Roots对象(栈区中的所有内容或者线程都可以作为GC Roots对象),然后将所
有GC Roots的对象可以直接或间接访问到的对象标记为存活的对象,其余的均为非存活对象,应该被清除。
#2、清除
清除的过程将遍历堆中所有的对象,将没有标记的对象全部清除掉。

直接参照は、スタック領域から始まるメモリアドレスへの直接参照を意味し、間接参照は、ヒープ、スタック参照からエリアを指し、
二つのリストL1にメモリアドレスへのさらなる言及した後、私たちの前の例をL2画像は、以下に示します

IMG

我々はL1とL2を削除すると、それはL1とL2のスタック領域の内容を一掃します

IMG

あなたはこの明確なラベル付けアルゴリズムを有効にすると、スタック領域のL1とL2で見られる、もはや存在しない(2つのだけスタック領域のそれぞれを参照)、
その後、表1と表2は、生存としてマークされていない、両方がクリアされますアウト、これは内部に持ち込ま循環参照解決でしょう
メモリリークの問題を。

世代回復

参照カウントベースのリカバリ・メカニズムは、それぞれが、メモリを再利用している、参照されるすべてのオブジェクトが再びトラバースされているカウントする必要があり
、非常に時間がかかり、その世代の導入は、回収効率を向上させるために回復し、世代回復は「採用されていますときのためのスペース
「戦略の間。
世代:
世代回復核となるアイデアは、次のとおりいくつかのスキャンは、変数がリサイクルされていない後の場合には、GC機構が考慮される
共通の変数が可変であるように、GCは、具体的には、その周波数走査を減少させます次のように原理は、
世代が可変生存時間(すなわち、異なる世代)の異なるレベルに応じて分割指す
新世代階層に、新たに定義された変数、それが見つかった場合、新しい世代は、スキャン毎に1分と仮定されますまだ引用変数、オブジェクトの量(重量は本質的に整数である)を加えた重量の変数は、(3とする)の設定値よりも大きい場合、それは若者の代わりに、より高いレベルに移動する一つのために、右GCごとに必要なスキャンの総数は少ない可変となるように、GC走査周波数は、走査の全時間を節約し、5分走査若い世代を想定し、(スキャン間隔が長い)新世代の若い世代よりも低いです次に、オブジェクトの若々しい世代は、同じように古い時代に移動されます。これは、(の代わりに)グレードが高いスキャンガベージコレクションは、以下の周波数である
:回復
回復はまだ回復のための基礎として、参照カウントを使用しているが
、回復は世代が効率を向上させる再生することができますが、しかし、いくつかの欠点もあります。

例如一个变量刚刚从新生代移入青春代,该变量的绑定关系就解除了,该变量应该被回收,但青春代的扫描频率低于新
生代,所以该变量的回收就会被延迟。

出典:https://www.cnblogs.com/xiaoyuanqujing
他ボーエン:https://www.cnblogs.com/xiaoyuanqujing

おすすめ

転載: www.cnblogs.com/chanyuli/p/11795665.html