相关文章推荐
谦逊的毛豆  ·  JS导出文本为文本文件-天翼云·  3 周前    · 
满身肌肉的红烧肉  ·  js正则-天翼云·  2 周前    · 
逃课的充电器  ·  Qt-QML-C++交互实现文件IO系统-后 ...·  1 周前    · 
有腹肌的扁豆  ·  Mybatis if test 判断 ...·  6 天前    · 
稳重的胡萝卜  ·  如何在HTML中换行而不使用<br>标签-天翼云·  2 天前    · 
至今单身的登山鞋  ·  python ...·  1 年前    · 
豪气的墨镜  ·  JS for循环语句的用法·  2 年前    · 
卖萌的小马驹  ·  php使用mPDF实战案例分析字符串太长时文 ...·  2 年前    · 
有胆有识的黑框眼镜  ·  C语言等待一秒,延时函数sleep()_楚春 ...·  2 年前    · 
读研的面包  ·  化工系张强团队发表综述 ...·  2 年前    · 
Code  ›  深入理解Python内存管理与垃圾回收,再也不怕问了(二)-天翼云
云计算 内存管理 天翼云 天翼
https://www.ctyun.cn/zhishi/p-182201
才高八斗的西红柿
1 年前

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
查看全部活动
热门活动
  • 2024·上云采购狂欢季 NEW 爆款2核4G云主机82.8元/年起!
  • 新客特惠 NEW 全场热销云主机1.5折起!
  • 算力套餐 NEW 让算力触手可及
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 中小企业上云场景组合购 NEW 建站、域名等场景一站式购齐,组合购9元起!
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 云主机特惠 HOT 多款云主机新老同享,满足您的上云需求!
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务。
进入甄选商城 进入云市场
办公协同
  • WPS云文档天翼云版 翼企云( License版) 蓝信安全移动工作平台(SAAS) SSL证书 新域名服务 税务风控云 商企云财税(SAAS版) 翼云加速-标准版包月套餐 天翼云管家2.0 天翼云管家 翼备份(SaaS版)300G 智慧工厂_生产流程管理解决方案 天翼智慧工地 天翼全栈混合云敏捷版(软件) 天翼全栈混合云敏捷版(一体机)

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云技术合作伙伴
  • 天翼云OpenAPI中心 天翼云EasyCoding平台
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云培训认证
  • 天翼云学堂 天翼云市场商学院
天翼云服务合作伙伴
  • 天翼云MSP合作伙伴 天翼云集成商交付能力认证
天翼云合作计划
  • 央企云合作计划
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴 天翼云甄选商城合作伙伴
天翼云东升计划
  • 东升适配创新中心 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
资源与工具
  • 天翼云OpenAPI EasyCoding敏捷开发平台 AI创作间
培训与认证
  • 天翼云学堂 天翼云认证

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • OpenAPI中心 客户支持计划 专家技术服务

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云 天翼云4.0 天翼云APP 全球基础设施 分析师和白皮书 天翼云·创新直播间 2023云生态大会 2022云生态大会 天翼云中国行 支持与服务 了解天翼云
  • 站点切换
    • 中国站
  • 文档
  • 控制中心
  • 备案
  • 管理中心

深入理解Python内存管理与垃圾回收,再也不怕问了(二)

首页 知识中心 软件开发 文章详情页

深入理解Python内存管理与垃圾回收,再也不怕问了(二)

2023-04-07 07:04:34 阅读次数:189

python

垃圾回收机制

来看一下Python中的垃圾回收技术:

  • 引用计数为主
  • 标记清除和分代回收为辅
  • 如果一个对象的引用计数为0,Python解释器就会回收这个对象的内存,但引用计数的缺点是不能解决循环引用的问题,所以我们需要标记清除和分代回收。

    什么是引用计数

  • 每个对象都有存有指向该对象的引用总数
  • 查看某个对象的引用计数 sys.getrefcount()
  • 可以使用del关键字删除某个引用
  • import sys
    l = []
    print(sys.getrefcount(l))	# Output: 2
    l2 = l
    l3 = l
    l4 = l3
    print(sys.getrefcount(l))	# Output: 5
    del l2
    print(sys.getrefcount(l))	# Output: 4
    i = 1
    print(sys.getrefcount(i))	# Output: 140
    a = i
    print(sys.getrefcount(i))	# Output: 141
    

    当对象的引用计数达到零时,解释器会暂停,来取消分配它以及仅可从该对象访问的所有对象。即满足引用计数为0的时候,会启动垃圾回收。

    但是引用计数不能解决循环引用的问题,就如下的代码不停跑就能把电脑内存跑满:

    >>> a = []
    >>> b = []
    >>> while True:
    ...     a.append(b)
    ...     b.append(a)
    [1]    31962 killed     python
    

    标记清除算法作为Python的辅助垃圾收集技术主要处理的是一些容器对象,比如list、dict、tuple,instance等,因为对于字符串、数值对象是不可能造成循环引用问题。标记清除和分代回收就是为了解决循环引用而生的。

    它分为两个阶段:第一阶段是标记阶段,GC会把所有的活动对象打上标记,第二阶段是把那些没有标记的对象非活动对象进行回收。

    对象之间通过引用(指针)连在一起,构成一个有向图,对象构成这个有向图的节点,而引用关系构成这个有向图的边。从根对象(root object)出发,沿着有向边遍历对象,可达的(reachable)对象标记为活动对象,不可达的对象就是要被清除的非活动对象。根对象就是全局变量、调用栈、寄存器。

    在上图中,可以从程序变量直接访问块1,并且可以间接访问块2和3。程序无法访问块4和5。第一步将标记块1,并记住块2和3以供稍后处理。第二步将标记块2,第三步将标记块3,但不记得块2,因为它已被标记。扫描阶段将忽略块1,2和3,因为它们已被标记,但会回收块4和5。

    标记清除算法作为Python的辅助垃圾收集技术,主要处理的是一些容器对象,比如list、dict、tuple等,因为对于字符串、数值对象是不可能造成循环引用问题。

    Python使用一个双向链表将这些容器对象组织起来。不过,这种简单粗暴的标记清除算法也有明显的缺点:清除非活动的对象前它必须顺序扫描整个堆内存,哪怕只剩下小部分活动对象也要扫描所有对象。

    分代回收(自动)

    分代回收是建立在标记清除技术基础之上的,是一种以空间换时间的操作方式。

  • Python将所有的对象分为0,1,2 三代
  • 所有的新建的对象都是0代对象
  • 当某一代对象经历过垃圾回收,依然存活,那么它就被归入下一代对象。
  • 同时,分代回收是建立在标记清除技术基础之上。分代回收同样作为Python的辅助垃圾收集技术处理那些容器对象。

    Python运行时,会记录其中分配对象(object allocation)和取消分配对象(object deallocation)的次数。

    当两者的差值高于某个阈值时,垃圾回收才会启动

  • 查看阈值gc.get_threshold()
  • import gc
    print(gc.get_threshold())  # Output: (700, 10, 10)
    

    get_threshold()返回的(700, 10, 10)返回的两个10。也就是说,每10次0代垃圾回收,会配合1次1代的垃圾回收;而每10次1代的垃圾回收,才会有1次的2代垃圾回收。理论上,存活时间久的对象,使用的越多,越不容易被回收,这也是分代回收设计的思想。

    具体参考gc模块。

  • gc.collect()手动回收
  • objgraph模块中的count()记录当前类产生的实例对象的个数
  • import gc
    result = gc.collect()
    print(result)
    import objgraph
    
    class Person(Object):
    class Cat(object):
    p = Person()
    c = Cat()
    p.name ='yuzhou1su'
    c.master = p
    print(sys.getrefcount(p))
    print(sys.getfefcount(c))
    del p
    del c
    gc.collect()
    print(objgraph.count('Person'))
    print(objgraph.count('Cat'))
    

    当定位到哪个对象存在内存泄漏,就可以用show_backrefs查看这个对象的引用链。

    内存池(memory pool)机制

    频繁 申请、消耗 会导致大量的内存碎片,致使效率变低。

    内存池的概念就是在内存中申请一定数量的,大小相等的内存块留作备用。

    内存池池由单个大小类的块组成。每个池维护一个到相同大小类的其他池的双向链接列表。这样,即使在不同的池中,该算法也可以轻松找到给定块大小的可用空间。

    当有新的内存需求时,就会先从内存池中分配内存留给这个需求。内存不够再申请新的内存。

    内存池本身必须处于以下三种状态之一:

    优点:减少内存碎片,提高效率。

    版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.51cto.com/yuzhou1su/3782183,作者:宇宙之一粟,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

    上一篇: 详解排序算法(Python实现)

    下一篇: Python高级语法(11)多线程、多进程、协程简介与选择

    相关文章

    2024-03-29 09:54:58

    Python 判断字典是否有key,判断字典key的个数

    Python 判断字典是否有key,判断字典key的个数

    2024-03-29 09:54:58
    python 2024-03-29 09:54:58

    Python协程性能测试asyncio vs gevent(异步并发)

    Python协程性能测试asyncio vs gevent(异步并发)

    2024-03-29 09:54:58
    python 2024-03-29 09:54:58

    python try语句相关使用

    python try语句相关使用

    2024-03-29 09:54:58
    python 2024-03-29 09:54:58

    Stream API 函数式编程 - 告别for循环,代码竟能写的如此优雅?

    Stream API 函数式编程 - 告别for循环,代码竟能写的如此优雅?

    2024-03-29 09:54:58
    python 2024-03-29 09:54:58

    redis集群加密码后,python的rediscluster模块升级1.3.4版本不生效

    redis集群加密码后,python的rediscluster模块升级1.3.4版本不生效

    2024-03-29 09:54:58
    python redis 2024-03-29 09:54:58

    Python3 filter函数使用

    filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。

    2024-03-29 09:54:58
    python 2024-03-28 09:00:50

    Python算法学习[7]—内部排序算法&技术解惑

    Python算法学习[7]—内部排序算法&技术解惑

    2024-03-28 09:00:50
    python 2024-03-28 09:00:50

    Python算法学习[9]—常见典型的数学问题&代码求解

    在计算机科学中,数学问题是一种经典的编程问题。本文将介绍三个常见的数学问题:质数判断、斐波那契数列和最大公约数,并提供Python代码来实现这些问题的解决方案。

    2024-03-28 09:00:50
    python 2024-03-28 09:00:50

    Python OpenCv学习基础知识四

    Python OpenCv学习基础知识四

    2024-03-28 09:00:50
    opencv python 2024-03-28 09:00:50

    python turtle库 绘制 红旗 代码及效果图

    python turtle库 绘制 红旗 代码及效果图

    2024-03-28 09:00:50
    python
    查看更多
    推荐标签

    作者介绍

    天翼云小翼
    天翼云用户

    文章

    14259

    阅读量

    1922472

    查看更多

    最新文章

    Python协程性能测试asyncio vs gevent(异步并发)

    2024-03-29 09:54:58

    Stream API 函数式编程 - 告别for循环,代码竟能写的如此优雅?

    2024-03-29 09:54:58

    Python3 filter函数使用

    2024-03-29 09:54:58

    Python 判断字典是否有key,判断字典key的个数

    2024-03-29 09:54:58

    Python算法学习[9]—常见典型的数学问题&代码求解

    2024-03-28 09:00:50

    Python算法学习[7]—内部排序算法&技术解惑

    2024-03-28 09:00:50

    查看更多

    热门文章

    Linux实用命令authconfig和authconfig-tui(备忘)

    2023-03-16 07:49:58

    07Python高级变量类型

    2023-05-11 06:07:12

    python学习——面向对象编程

    2023-04-25 10:20:57

    Python数据库测试实战教程

    2023-06-07 07:31:52

    一个简单的http server,处理get和post请求,Python实现

    2023-04-13 09:31:09

    Python 输出函数运行时间的两种方式(常规、装饰器)

    2023-03-07 06:59:32

    查看更多

    热门标签

    python spring javascript SpringBoot Python springboot Spring
    查看更多

    相关产品

    弹性云主机

    随时自助获取、弹性伸缩的云服务器资源

    天翼云电脑(公众版)

    便捷、安全、高效的云电脑服务

    对象存储

    高品质、低成本的云上存储服务

    云硬盘

    为云上计算资源提供持久性块存储

    查看更多

    随机文章

    Python编程:lambda替代品-operator模块

    Python 精确查找指定后缀名的所有文件

    BST二叉搜索树插入节点建树并找出不平衡节点,networkx,Python

    networkx节点node样式style定制化,Python

    Python列表list转字符串报错:expected str instance, int found

    python学习(6)——列表元素的添加、删除、修改及排序

    • 7*24小时售后
    • 无忧退款
    • 免费备案
    • 专家服务
    售前咨询热线
    400-810-9889转1
    • 天翼云APP
     
    推荐文章
    谦逊的毛豆  ·  JS导出文本为文本文件-天翼云
    3 周前
    满身肌肉的红烧肉  ·  js正则-天翼云
    2 周前
    逃课的充电器  ·  Qt-QML-C++交互实现文件IO系统-后继-具体文件IO的实现-天翼云
    1 周前
    有腹肌的扁豆  ·  Mybatis if test 判断 list不为 null 并且判断集合大小不为0-天翼云
    6 天前
    稳重的胡萝卜  ·  如何在HTML中换行而不使用<br>标签-天翼云
    2 天前
    至今单身的登山鞋  ·  python datetime库使用和时间加减计算 - Monogem - 博客园
    1 年前
    豪气的墨镜  ·  JS for循环语句的用法
    2 年前
    卖萌的小马驹  ·  php使用mPDF实战案例分析字符串太长时文本变小无法自动分页的解决方案_漏刻有时的技术博客_51CTO博客
    2 年前
    有胆有识的黑框眼镜  ·  C语言等待一秒,延时函数sleep()_楚春秋的博客-CSDN博客
    2 年前
    读研的面包  ·  化工系张强团队发表综述 评论分子模拟与数据科学驱动的电解液研究-清华大学
    2 年前
    今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
    删除内容请联系邮箱 2879853325@qq.com
    Code - 代码工具平台
    © 2024 ~ 沪ICP备11025650号