• python的内存机制


    文章转载自:http://www.cnblogs.com/jingtyu/p/7472662.html

    python中的内存机制

     

    首先要明白对象和引用的概念 (例子:a=1, a为引用,1为对象,对象1的引用计数器为1,b=1此时内存中只有一个对象1,a,b都为引用,对象的引用计数器此时为2,因为有两个引用)

    复制代码
    a=1,b=1
    id(a)=id(b)    #短的字符串,数字python在内存中是一个对象
             
    a=[],b=[]
    id(a)!=id(b)      #字典,数组这样的对象在内存中python会new两个不同的对象
       
    a="new a string"
    b="new a string"    #长的字符串python在内存中同样会new两个不同的对象
    id(a)!=id(b)  
    复制代码

    引用计数器如何减少,当删除该对象的引用时候该对象的引用计数器将会减少。

    复制代码
    a=[1,2]  
    b= [a,a]  #a对象的引用计数为2
    del b[0]   #a对象的引用计数变为1
    
    #字典同理
    a=1
    {"a":a,"b":a}  #a对象的引用计数为2
    del b[b]         #a对象的引用计数变为1
    复制代码

    python的垃圾回收(3种)

    引用计数

    当对象的引用的计数器变为0的时候,该对象可能在内存中,但是已经不能访问。python的垃圾回收时候不能做其他操作,如果一个对象的引用计数变为0的时候python就去回收该对象,那么很显然Python的效率会很差,那什么时候python会来回收呢?这是一个好问题。

    python会监听自己new了多少个新的对象和有多少对象的引用计数器变为了,两个数值做差的到的数和阈值去比较,大于阈值,内存开始进行垃圾回收,销毁引用计数器为0的对象。

    优点:简单实时性,缺点:维护引用计数消耗资源,循环引用。

    分代回收

    为了提高效率,有很多对象,清理了很多次他依然存在,可以认为,这样的对象不需要经常回收,可以把它分到不同的集合,每个集合回收的时间间隔不同。简单的说这就是python的分代回收。

    具体说一下,python中的垃圾分为1,2,3代,在1代里的对象每次回收都会去清理,当清理后有引用的对象依然存在,此时他会进入2代集合,同理2代集合清理的时候存在的对象会进入2代集合。

    每个集合的清理时间如何分配,会先清理1代垃圾,当清理10次一代垃圾后会清理一次2代垃圾,当清理10次2代垃圾后会清理2代垃圾。

    标记清除

    按需分配,当内存不够的时候,从寄存器和程序栈上的引用出发,遍历对象,将遍历的对象打上标记,然后在内存中清除没有标记的对象。

    知之为知之,不知为不知
  • 相关阅读:
    UTF-8 GBK UTF8 GB2312 之间的区别和关系
    为什么要需求分析
    数据库建表原则
    使用SQL存储过程有什么好处 用视图有什么好处
    SQL使用视图的优缺点
    百度地图添加多个行政区划
    性能测试日志分析之awk基础用法
    Nginx 安装配置
    linux的top命令参数详解
    Java小程序Linux下运行
  • 原文地址:https://www.cnblogs.com/bevishe/p/10411317.html
Copyright © 2020-2023  润新知