Python 如何实现高性能(浅谈垃圾回收!)

什么是垃圾回收: 垃圾回收实际上调用的是析构方法 __del__
  简而言之指的是删除引用
    1,对象被创建
    2,对象被引用
    3,对象被作为参数
    4,对象作为一个元素存放在一个容器之中都会使引用增加1。
  相反,
    1,对象的别名被显式销毁
    2,对象的别名被赋予新的对象
    3,一个对象离开它的作用域,例如f函数执行完毕时,func函数中的局部变量(全局变量不会)
    4,对象所在的容器被销毁,或从容器中删除对象
   a = 3  #a对象被创建,引用加1(针对于3来说)
    b = a  #a 对象被赋值,引用加1
    del a  # a 的引用减去1,3不会被清理,以另一种形式而存在。
  这只是不是容器的情况下。如果对象是容器的情况下,那么就会有另一种情况!
python 垃圾回收机制的缺陷(针对容器而言)
  1,目前版本的 Python 采用引用计数的方式来管理分配的内存。
  2,Python 的每个对象都有一个引用计数,这个引用计数表明了有多少对象在指向它,当这个引用计数为 0 时,该对象就释放了。
  3,引用计数对于多数程序都工作地很好,然而,引用计数有一个本质上的缺陷,是由于循环引用引起的.
   li_ =[]  # 增加引用1
    li_.append(li_) #自己引用自己,增加引用1
    del li_   #删除引用减去1 
 但是在实际内存中,这个列表 li 永远不会释放.(只是针对引用计数而言)
传统的垃圾回收工作方式是什么呢?
  先从根目录寻找对象,找得到的就会被标记为活跃状态,并且释放其他对象。
  由于扩展模块的工作方式(牵扯到c ),Python 不能完全地确定根对象集合。如果根对象集合没法被准确地确定,我们就有释放仍然被引用的对象的风险。
那么如何做呢?如何去完全释放干净对象内存呢?
  一种解决方式是通过双向链表的方式,将每个容器都用链表穿起来,通过链表能访问的,都是活跃的对象,相反也可以定位不活跃的对象集合.
但是真的是这么吗?会不会造成浪费呢?
  答案是肯定的!

 

posted @ 2018-05-03 10:10  十七楼的羊  阅读(509)  评论(0编辑  收藏  举报