zoukankan      html  css  js  c++  java
  • 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,就会清除。在高频率的检查了几次之后,如果有变量连续挺过了这几次检查,那么,这些变量就会上升成为第二代变量,第二代变量的检查频率就会略低。同理,第二代中有变量挺过了检查,就会升级成为第三代,第三代的变量的检查频率更低。这样做的好处就是不用每次检查都检查所有变量。从而提高了垃圾回收机制的效率

      

  • 相关阅读:
    [原][osg]Geometry详解
    [osg]节点遍历nodevisitor浅析
    [原][osg]osgconv浅析
    [原][游戏][攻略]仙之侠道玖章-- --从入门到放弃
    [转][linux]简单的linux下的tcp/udp
    [转][c++][跨平台]c++跨平台开发小结
    人机交互,来和我猜拳吧!
    从零开始学测试【1】测试方法术语总结
    从零开始学测试【2】网页登录界面
    JSP 和 ASP.NET 谁能主宰未来【转】
  • 原文地址:https://www.cnblogs.com/KbMan/p/11144179.html
Copyright © 2011-2022 走看看