1. 程式人生 > >DAY 21內存處理與正則

DAY 21內存處理與正則

spa 處理 回收 循環 http 釋放 分享圖片 劃分 次數

一.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內存處理與正則