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 2899 Strange fuction
    HDU 2899 Strange fuction
    HDU 2199 Can you solve this equation?
    HDU 2199 Can you solve this equation?
    Java实现 LeetCode 700 二叉搜索树中的搜索(遍历树)
    Java实现 LeetCode 700 二叉搜索树中的搜索(遍历树)
    Java实现 LeetCode 700 二叉搜索树中的搜索(遍历树)
    Java实现 LeetCode 699 掉落的方块(线段树?)
    Java实现 LeetCode 699 掉落的方块(线段树?)
    Java实现 LeetCode 699 掉落的方块(线段树?)
  • 原文地址:https://www.cnblogs.com/KevinGeorge/p/8196118.html
Copyright © 2011-2022 走看看