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层和-2层:由操作系统操作 。
- 第0层:大内存,若请求分配的内存大于256kb,使用malloc、free 等函数分配、释放内存 。
- 第1层和第2层:由python的接口函数Pymem_Malloc实现,若请求的内存在小于等于256kb时使用该层进行分配 。
- 第3层(最上层):用户对python对象的直接操作
文章插图
图片来源:https://www.c-sharpcorner.com/article/memory-management-in-python/
总结本文主要介绍了Python的参数传递、浅拷贝、深拷贝,垃圾回收和内存池机制 。
- Python 中参数的传递既不是值传递,也不是引用传递,而是赋值传递,或者是叫对象的引用传递 。需要注意可变对象和不可变对象的区别 。比较操作符==比较对象间的值是否相等,而`is比较对象是否指向同一个内存地址 。
- 浅拷贝中的元素是对原对象中子对象的引用,如果父对象中的元素是可变的,改变它的值也会影响拷贝后的对象 。深拷贝则会递归地拷贝原对象中的每一个子对象,是对原对象的完全拷贝 。
- Python垃圾回收包括引用计数、标记清除和分代回收三种,可以使用gc模块来进行垃圾回收的配置 。为了减少内存碎片,提升效率,Python使用了Pymalloc来管理小于等于256kb的小内存 。
推荐阅读
- 绿茶红茶作用禁忌症,酸枣仁芡实茶的功效与作用及禁忌症
- 莓茶配伍红茶的药效,土家莓茶的作用及功效
- Linux搭建rsync备用服务器,及配置文件详解
- 公共关系专业就业方向及前景
- 柑红茶的功效与作用,由柑柠檬茶的功效与作用及禁忌
- 喝红茶能放冰糖么,冰糖茉莉茶的功效与作用及禁忌
- 红枣红茶水,红枣蜜茶的功效与作用及禁忌
- 红茶可以和金银花,金银花甘草茶的功效和作用及食用方法
- 益母草搭配红茶起,玫瑰花益母草茶的功效与作用及食用方法
- 书包十大品牌及介绍