Python对象及内存管理机制( 三 )

  • gc.enable() :启用自动垃圾回收
  • gc.disable():停用自动垃圾回收
  • gc.isenabled():如果启用了自动回收则返回 True 。
  • gc.collect(generation=2):不设置参数会对所有代执行一次回收
  • gc.set_threshold(threshold0[, threshold1[, threshold2]]):设置垃圾回收阈值
  • gc.get_count():当前回收计数
  • 垃圾回收启动的默认阈值
    import gcprint(gc.get_threshold()) 输出:
    (700, 10, 10)700是垃圾回收启动的阈值,对象分配数量减去释放数量的值大于 700 时,就会开始进行垃圾回收,每10次0代垃圾回收,会导致一次1代回收;而每10次1代的回收,才会有1次的2代回收 。可以使用set_threshold()方法重新设置 。
    Python内存管理机制:PymallocPymallocPython实现了一个内存池(memory pool)机制,使用Pymalloc对小块内存(小于等于256kb)进行申请和释放管理 。
    当 Python 频繁地创建和销毁一些小的对象时,底层会多次重复调用 malloc 和 free 等函数进行内存分配 。这不仅会引入较大的系统开销,而且还可能产生大量的内存碎片 。
    内存池的概念就是预先在内存中申请一定数量的内存空间,当有有满足条件的内存请求时,就先从内存池中分配内存给这个需求,如果预先申请的内存已经耗尽,Pymalloc allocator 会再申请新的内存(不能超过预先设置的内存池最大容量) 。垃圾回收时,回收的内存归还给内存池 。这样做最显著的优势就是能够减少内存碎片,提升效率 。
    如果应用的内存需求大于 pymalloc 设置的阈值,那么解释器再将这个请求交给底层的 C 函数(malloc/realloc/free等)来实现 。
    python内存池金字塔
    1. 第-1层和-2层:由操作系统操作 。
    2. 第0层:大内存,若请求分配的内存大于256kb,使用malloc、free 等函数分配、释放内存 。
    3. 第1层和第2层:由python的接口函数Pymem_Malloc实现,若请求的内存在小于等于256kb时使用该层进行分配 。
    4. 第3层(最上层):用户对python对象的直接操作

    Python对象及内存管理机制

    文章插图
    图片来源:https://www.c-sharpcorner.com/article/memory-management-in-python/
    总结本文主要介绍了Python的参数传递、浅拷贝、深拷贝,垃圾回收和内存池机制 。
    • Python 中参数的传递既不是值传递,也不是引用传递,而是赋值传递,或者是叫对象的引用传递 。需要注意可变对象和不可变对象的区别 。比较操作符==比较对象间的值是否相等,而`is比较对象是否指向同一个内存地址 。
    • 浅拷贝中的元素是对原对象中子对象的引用,如果父对象中的元素是可变的,改变它的值也会影响拷贝后的对象 。深拷贝则会递归地拷贝原对象中的每一个子对象,是对原对象的完全拷贝 。
    • Python垃圾回收包括引用计数、标记清除和分代回收三种,可以使用gc模块来进行垃圾回收的配置 。为了减少内存碎片,提升效率,Python使用了Pymalloc来管理小于等于256kb的小内存 。




    推荐阅读