DAY 21內存處理與正則
一.python的垃圾回收機制
1.引用計數(垃圾回收機制的根本)
1.引用計數是用來記錄值的內存地址被記錄的次數的
2.每一次對值地址的引用都可以使該值的引用計數+1
3.每一次對值地址的釋放都可以使該值的引用計數-1
4.當一個值的引用計數為0時,該值就會被系統的垃圾回收機制回收
2.標記清除
1.循環導入(內存泄漏)
ls1 = [666]
ls2 = [888]
ls1.append(ls2)
ls2.append(ls1)
print(ls1) # [666, [888, [...]]]
print(ls2) #[888, [666, [...]]]
list1與list2是相互引用的,產生了內存泄漏
即使不存在其他對象對它們的引用list1與list2的引用計數也將持續為1,它倆所占用的內存永遠無法被回收
2.循環導入的解決(標記清除)
標記:標記的過程就是遍歷所有GC Roots對象(棧區中的所有內容或者線程都可以作為GC Roots對象),然後將所有GC Roota對象可以直接或間接訪問到的對象標記為存活的對象,存放到新的內存空間中
刪除:刪除的過程將遍歷堆中所有的對象,將之前所有的內容全部清除
3.分代回收
分代:值的是根據存活時間來為變量劃分不同等級(也就是不同的代)
新定義的變量,放到新生代這個等級中,假設每隔1分鐘掃描新生代一次,如果發現變量依然被引用,那麽該對象的權重(權重本質就是個整數)加一,當變量的權重大於某個設定得值(假設為3),會將它移動到更高一級的青春代,青春代的gc掃描的頻率低於新生代(掃描時間間隔更長),假設5分鐘掃描青春代一次,這樣每次gc需要掃描的變量的總個數就變少了,節省了掃描的總時間,接下來,青春代中的對象,也會以同樣的方式被移動到老年代中。也就是等級(代)越高,被垃圾回收機制掃描的頻率越低
DAY 21內存處理與正則