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

 

 

 

  

posted @ 2019-07-06 21:17  KbMan  阅读(217)  评论(0编辑  收藏  举报