美文网首页
python内存管理机制

python内存管理机制

作者: 火乐君_52cd | 来源:发表于2018-09-04 12:13 被阅读0次

    Python内存管理机制

    Python内存管理机制主要包括以下三个方面:

    • 引用计数机制
    • 垃圾回收机制
    • 内存池机制

    1. 引用计数机制

    • 可以用is判断两个引用是否指向同一个对象
    • 可以用sys.getrefcount()获得引用计数

    引用计数增加

    1.对象被创建:x=4
    2.另外的别人被创建:y=x
    3.被作为参数传递给函数:foo(x)
    4.作为容器对象的一个元素:a=[1, x, ‘33’]

    引用计数减少

    1.一个本地引用离开了它的作用域。比如上面的foo(x)函数结束时,x指向的对象引用减1。
    2.对象的别名被显式的销毁:del x ;或者del y
    3.对象的一个别名被赋值给其他对象:x=789
    4.对象从一个窗口对象中移除:myList.remove(x)
    5.窗口对象本身被销毁:del myList,或者窗口对象本身离开了作用域。


    2. 垃圾回收机制

    引用计数归零直接回收

    标记-清除回收机制

    • 原理:
      “标记-清除”采用了更好的做法,我们并不改动真实的引用计数,而是将集合中对象的引用计数复制一份副本,改动该对象引用的副本。对于副本做任何的改动,都不会影响到对象生命走起的维护。
      这个计数副本的唯一作用是寻找root object集合(该集合中的对象是不能被回收的)。当成功寻找到root object集合之后,首先将现在的内存链表一分为二,一条链表中维护root object集合,成为root链表,而另外一条链表中维护剩下的对象,成为unreachable链表。之所以要剖成两个链表,是基于这样的一种考虑:现在的unreachable可能存在被root链表中的对象,直接或间接引用的对象,这些对象是不能被回收的,一旦在标记的过程中,发现这样的对象,就将其从unreachable链表中移到root链表中;当完成标记后,unreachable链表中剩下的所有对象就是名副其实的垃圾对象了,接下来的垃圾回收只需限制在unreachable链表中即可。

    分代回收机制

    • 原理:
      将系统中的所有内存块根据其存活时间划分为不同的集合,每一个集合就成为一个“代”,垃圾收集的频率随着“代”的存活时间的增大而减小。也就是说,活得越长的对象,就越不可能是垃圾,就应该减少对它的垃圾收集频率。那么如何来衡量这个存活时间:通常是利用几次垃圾收集动作来衡量,如果一个对象经过的垃圾收集次数越多,可以得出:该对象存活时间就越长

    内存池

    image.png
    • Python的内存机制呈现金字塔形状:
      1. -1,-2层主要有操作系统进行操作;
      2. 第0层是C中的malloc,free等内存分配和释放函数进行操作;
      3. 第1层和第2层是内存池,有Python的接口函数PyMem_Malloc函数实现,当对象小于256K时有该层直接分配内存;
      4. 第3层是最上层,也就是我们对Python对象的直接操作;

    相关文章

      网友评论

          本文标题:python内存管理机制

          本文链接:https://www.haomeiwen.com/subject/tbhgwftx.html