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需要扫描的变量的总个数就变少了,节省了扫描的总时间,接下来,青春代中的对象,也会以同样的方式被移动到老年代中。也就是等级(代)越高,被垃圾回收机制扫描的频率越低

     

猜你喜欢

转载自www.cnblogs.com/majingjie/p/10717175.html