• python中的垃圾回收机制


    Python采用引用计数的机制进行垃圾回收。

    引用计数:

      当变量创建时,变量的值就多了一个引用,它的引用计数就+1

      如果又有一个变量指向这个值时,引用计数继续加1,如果变量被清除,引用计数就减1。

      当变量的值的引用计数为0时,就会触发引用计数机制,回收这个对象。

      假如,两个变量引用其值,值之间又互相引用,例如:有两个列表,l1=[1], l2 = [2]  l1.append(l2), l2.append(l1),当11和l2 与他们引用的值解绑时,由于他们的值在互相引用,导致他们的引用计数永远不会为0,意味着不会触发引用计数的回收机制。长时间下去,就会导致内存溢出的问题。为了解决循环引用的问题,python又出了一中回收机制叫做标记清除。

    标记清除:为了解决引用计数循环引用的问题

      线程能访问到的栈区的变量叫做 gc roots  

      当内存达到了一定阈值,就会触发标记清除机制。

      首先,gc roots能直接或间接引用到的值,会被标记为存活状态。

      然后将这些存活状态的值做一份拷贝,变量完成重新引用。

      清除机制,将不是存活状态的值全部清除。

    分代回收:垃圾回收机制的优化。

      在新创建的变量中,我们称这些新创建的变量为第一代变量。垃圾回收机制会隔一段时间高频率检查这些变量的引用计数。如果引用为0,就会清除。在高频率的检查了几次之后,如果有变量连续挺过了这几次检查,那么,这些变量就会上升成为第二代变量,第二代变量的检查频率就会略低。同理,第二代中有变量挺过了检查,就会升级成为第三代,第三代的变量的检查频率更低。这样做的好处就是不用每次检查都检查所有变量。从而提高了垃圾回收机制的效率

      

  • 相关阅读:
    3:Exchange2016图形化安装和无人值守安装
    hdu 3980 Paint Chain (sg)
    hdu 1850 Being a Good Boy in Spring Festival (Nim)
    zoj 2971 Give Me the Number
    hdu 1847 Good Luck in CET4 Everybody! (sg)
    hdu 1754 I hate it (线段树)
    poj 1704 Georgia ans Bob (StaircaseNim)
    hdu 1907 John (Nim变形)
    hdu 1536 SNim (sg)
    hdu 1166 敌兵布阵 (线段树)
  • 原文地址:https://www.cnblogs.com/KbMan/p/11144179.html
Copyright © 2020-2023  润新知