zoukankan      html  css  js  c++  java
  • python的内存管理与垃圾回收机制学习

    一、python内存申请:

    1、python的内存管理分为六层:最底的两层有OS控制。第三层是调用C的malloc和free等进行内存控制。第四层第五层是python的内存池。最上层使我们接触的直接对python对象进行操作。

    2、python申请对象时候小于256Byte的字节申请回直接使用python自己的内存分配系统,当大于256Byte的时候会调用malloc直接分配一个256k的大内存空间。释放内存空间时候会回收到内存池中而不是直接调用free释放掉。

    3、深浅拷贝的不同(id☞内存地址):

      (1)深拷贝(基本数据类型:整型、浮点、字符串、元祖、列表等)【a=x ; b=a ; a变b不变的情况】一个变化后两者id就不一样了,之前是一样的。(会新增一块地址)

     1 Python 2.7.9 (default, Dec 10 2014, 12:28:03) [MSC v.1500 64 bit (AMD64)] on win32
     2 Type "help", "copyright", "credits" or "license" for more information.
     3 >>> a = 1
     4 >>> b = a
     5 >>> id(a)
     6 6579496L
     7 >>> id(b)
     8 6579496L
     9 >>> a = 2
    10 >>> id(a)
    11 6579472L
    12 >>> id(b)
    13 6579496L
    14 >>>

    (2)浅拷贝(数据结构数据类型:字典等)【a=x ; b=a ; a变b也变的情况】一个变化后两者id仍然一样,之前是一样的,且修改前后id不变。(不会新增一块地址)

     1 Python 2.7.9 (default, Dec 10 2014, 12:28:03) [MSC v.1500 64 bit (AMD64)] on win32
     2 Type "help", "copyright", "credits" or "license" for more information.
     3 >>> a = [1,2,3]
     4 >>> b = a
     5 >>> id(a)
     6 45528520L
     7 >>> id(b)
     8 45528520L
     9 >>> a = [1,2,3,4]
    10 >>> id(a)
    11 45643272L
    12 >>> id(b)
    13 45528520L
    14 >>> a
    15 [1, 2, 3, 4]
    16 >>> b
    17 [1, 2, 3]
    18 >>> a = {"a":1,"b":2}
    19 >>> b = a
    20 >>>
    21 >>>
    22 >>> id(a)
    23 45672376L
    24 >>> id(b)
    25 45672376L
    26 >>> a["a"] = 3
    27 >>> id(a)
    28 45672376L
    29 >>> id(b)
    30 45672376L
    31 >>> b
    32 {'a': 3, 'b': 2}
    33 >>>

    二、python的垃圾回收机制:

    1、首先python垃圾回收机制是以引用计数为主,划代分类为辅。

    2、引用计数:当有一个对象引用了目标对象,目标对象引用计数就加一。反向操作则引用计数减一,当引用计数为0时候则删除对象。

    3、类对象和基本数据类型对象的(析构函数)__del__:

     1 class A:
     2     def __init__(self):
     3         print "create object"
     4     def __del__(self):
     5         print "delete object"
     6 
     7 # a = A()
     8 # del a
     9 #其他类型:
    10 #a = 10
    11 #b = "ssss"
    12 #del a
    13 #del b

    4、引用计数+1情况:

    (1)对象被创建,例如a=23

    (2)对象被引用,例如b=a

    (3)对象被作为参数,传入到一个函数中,例如func(a)

    (4)对象作为一个元素,存储在容器中,例如list1=[a,a]

    5、引用计数-1的情况:

    (1)对象的别名被显式销毁,例如del a

    (2)对象的别名被赋予新的对象,例如a=24

    (3)一个对象离开它的作用域,例如f函数执行完毕时,func函数中的局部变量(全局变量不会)

    (4)对象所在的容器被销毁,或从容器中删除对象

    6、注明:

     函数调用变量A,A的引用计数+2 因为还有一步传参。

    7、gc模块

     1 #引用lib文件
     2 import gc #gc模块文件  is_enable()=True才会启动垃圾自动回收
     3 import sys
     4 
     5 gc.set_debug(gc.DEBUG_STATS|gc.DEBUG_LEAK)#打开gc模块调试信息
     6 
     7 #获取目标对象的引用计数
     8 a = []
     9 b = a
    10 print sys.getrefcount(a)
    11 print sys.getrefcount(b)
    12 
    13 gc.collect(para) #返回unreachable对象的个数。循环应用的引用计数非0,但是也是垃圾,呗收入gc.garbage但是不删除。
    14 #para = 0,1,2 0检查第一代对象 1检查一、二代对象  2检查一、二、三代对象。
    15 
    16 gc.set_threshold(threshold0[,threshold1[,threshold2]])#自动执行垃圾回收的频率
    17 gc.get_count()#获取当前自动执行垃圾回收的计数器,长度为3的一个list
    18 
    19 #垃圾回收有一个阈值 假设阈值(700,10,10)那么到了(699+1,x,x)时候就会启动。

     8、参考资料(鸣谢):

    http://www.cnblogs.com/Xjng/p/5128269.html

    http://blog.csdn.net/yueguanghaidao/article/details/11274737

    http://www.cnblogs.com/CBDoctor/p/3781078.html

  • 相关阅读:
    HDU 4291 A Short problem 第37届ACM/ICPC 成都赛区网络赛1004题 (找规律,取模求循环节)
    POJ 1276 Cash Machine(多重背包)
    HDU 4296 Buildings 第37届ACM/ICPC 成都赛区网络赛1009题 (贪心)
    POJ 2392 Space Elevator (多重背包)
    Mysql配置SSL
    error C2471: cannot update program database vc90.pdb
    Android 总结 转载
    MAX SDK的INode的变换矩阵,以及Object的一些常识
    C++游戏开发需要阅读的书籍
    游戏程序员养成计划
  • 原文地址:https://www.cnblogs.com/KevinGeorge/p/8196118.html
Copyright © 2011-2022 走看看