内存管理与垃圾回收

内存管理

python官方文档-内存管理

我们在python还是需要尽量避免手动管理内存,应该交给python自动管理。

垃圾回收

Python采用的是引用计数机制为主,标记-清理和分代收集两种机制为辅的策略。

引用计数

引用计数就是对对象的引用次数进行计数,可以将其抽象为:

引用计数结构体{引用计数;引用的对象;
};

那么当引用计数为0的时候,就会进行垃圾回收。

引用计数+1

1、对象被创建时,例如 mark="帅哥"
2、对象被copy引用时,例如 mark2=mark,此时mark引用计数+1
3、对象被作为参数,传入到一个函数中时
4、对象作为一个子元素,存储到容器中时,例如 list=[mark,mark2]

引用计数-1

1、对象别名被显式销毁,例如 del mark
2、对象引用被赋予新的对象,例如mark2=mark3,此时mark引用计数-1(对照引用计数+1的情况下的第二点来看)
3、一个函数离开他的作用域,例如函数执行完成,它的引用参数的引用计数-1
4、对象所在容器被销毁,或者从容器中删除。

查看引用计数

import sys
a = "mark 帅哥"
print(sys.getrefcount(a))

陷阱:需要注意,因为给getrefcount传递了参数a,因此也导致了引用计数+1,所以打印的结果是2,但是实际引用计数是1,故:引用计数=sys.getrefcount(xxx) - 1

引用计数机制优点

1、简单、直观
2、实时性,只要没有了引用就释放资源。

引用计数机制缺点

1、维护引用计数需要消耗一定的资源
2、循环引用时,无法回收。也正是因为这个原因,才需要通过标记-清理和分代收集机制来辅助引用计数机制。

标记-清除

我们来举个例子说明标记-清除的原理。对于数值,字符串是不存在循环引用的。循环引用只会出现在容器对象中。例如:

list1 = [0]
list2 = [1]
list1.append(list2)
list2.append(list1)

由于python中对象都是引用赋值,因此list1中包含它本身,list2中也包含它自身。这样就形成了循环引用。引用计数就无法为0,不被回收。为了解决这个问题,采用了标记-清除。它分为两个阶段:第一阶段是标记阶段,GC会把所有的『活动对象』打上标记,第二阶段是把那些没有标记的对象『非活动对象』进行回收。

关于标记-清除的更多信息参考:https://zhuanlan.zhihu.com/p/51095294

分代回收

对标记清除中的链表进行优化,将那些可能存在循引用的对象拆分到3个链表,链表称为:0/1/2三代,每代都可以存储对象和阈值,当达到阈值时,就会对相应的链表中的每个对象做一次扫描,除循环引用各自减1并且销毁引用计数器为0的对象。

缓存机制

实际上,并不是当引用计数为0的时候,就立即回收内存。因为这样将会导致python频繁的malloc和free,导致程序执行效率下降。引用计数器为0时,不会真正销毁对象,而是将他放到一个名为 free_list 的链表中,之后会再创建对象时不会在重新开辟内存,而是在free_list中将之前的对象来并重置内部的值来使用。

参考链接:
https://zhuanlan.zhihu.com/p/401376495
https://pythonav.com/wiki/detail/6/88/

python内存管理与垃圾回收相关推荐

  1. Python内存管理以及垃圾回收机制

    垃圾回收:用通俗点的语言解释就是内存管理和垃圾回收的过程. 大管家refchain 在Python的C源码中有一个名为refchain的环状双向链表,这个链表就比较厉害了,因为Python程序中一旦创 ...

  2. Python 内存管理与垃圾回收机制

    python python内存的泄露和溢出 前言 一.内存泄露和溢出 二.垃圾回收机制 1.引用计数机制 2.标记清除 3.分代回收 三.垃圾回收 总结 前言 虽然在做科研的路上并没有遇到内存方面的问 ...

  3. python内存的回收机制_python的内存管理和垃圾回收机制详解

    简单来说python的内存管理机制有三种 1)引用计数 2)垃圾回收 3)内存池 接下来我们来详细讲解这三种管理机制 1,引用计数: 引用计数是一种非常高效的内存管理手段,当一个pyhton对象被引用 ...

  4. python内存管理和释放_《python解释器源码剖析》第17章--python的内存管理与垃圾回收...

    17.0 序 内存管理,对于python这样的动态语言是至关重要的一部分,它在很大程度上决定了python的执行效率,因为在python的运行中会创建和销毁大量的对象,这些都设计内存的管理.同理pyt ...

  5. Python的内存管理与垃圾回收机制

    在使用真格量化时,一些用户希望了解如何来提高系统性能.通过了解Python的内存管理和垃圾回收机制,我们可以有针对性地去提高策略代码性能. Python内存管理机制 Python的内存管理机制:引入计 ...

  6. 详解JVM内存管理与垃圾回收机制2 - 何为垃圾

    随着编程语言的发展,GC的功能不断增强,性能也不断提高,作为语言背后的无名英雄,GC离我们的工作似乎越来越远.作为Java程序员,对这一点也许会有更深的体会,我们不需要了解太多与GC相关的知识,就能很 ...

  7. .NET基础 (05)内存管理和垃圾回收

    内存管理和垃圾回收 1 简述.NET中堆栈和堆的特点和差异 2 执行string abc="aaa"+"bbb"+"ccc"共分配了多少内存 ...

  8. 【转】.NET内存管理、垃圾回收

    ? .NET内存管理.垃圾回收 1. Stack和Heap     每个线程对应一个stack,线程创建的时候CLR为其创建这个stack,stack主要作用是记录函数的执行情况.值类型变量(函数的参 ...

  9. 详解JVM内存管理与垃圾回收机制5 - Java中的4种引用类型

    在Java语言中,除了基础数据类型的变量以外,其他的都是引用类型,指向各种不同的对象.在前文我们也已经知道,Java中的引用可以是认为对指针的封装,这个指针中存储的值代表的是另外一块内存的起始地址(对 ...

最新文章

  1. python监听文件最后修改人_Python持续监听文件变化代码实例
  2. LINUX 上的 Shebang 符号(#!)
  3. Android Studio 单刷《第一行代码》系列 02 —— 日志工具 LogCat
  4. dependencyManagement与dependencies区别
  5. 【Python】pandas 1.3版本主要更新内容一览
  6. c语言 数组指针,C语言数组名及指向数组指针的小结
  7. Linux网络编程 之 广播(五)
  8. 哪种语言 连接 oracle,Go语言连接Oracle(就我这个最全)
  9. 新型智能芯片防伪印章设备_思格特智能印章管理系统成功签约山东问童动力设备公司...
  10. 爱上MVC系列~过滤器实现对响应流的处理
  11. 天正cad计算机快捷键,CAD、天正快捷键(专用)
  12. FPGA丨中值滤波算法实现
  13. 4G5G学习过程中整理的专业名词的符号简称
  14. 小韦老师@神犇营-my1063-引爆炸弹
  15. Professor Forcing: A New Algorithm for Training Recurrent Networks翻译
  16. Android开发3年,4个月面试,终于拿到小米、京东、字节大厂offer
  17. 2023版大数据学习路线图(适合自学)
  18. Android 8.0以上系统应用如何保活
  19. 世界著名电影特效公司
  20. Android尺寸标注设计大全和Android切图规范

热门文章

  1. 【nginx负载均衡(四)】nginx的高可用集群利用keepalive实现双vip
  2. 如何使用3DVIZ(或3DMAX)创建地形对象?
  3. Vue引入第三方Element UI 组件
  4. python如何往oracle写入数据_python3向oracle插入数据
  5. 腾讯实习生入职报到注意点(2012)
  6. 28天读完349页,这份阿里面试通关手册,助我闯进字节跳动
  7. php(TP5)+redis实现秒杀抢购(限制用户购买次数)(附源码)
  8. 聊城大学计算机学院格创,聊城大学计算机学院第九届科技学术节活动方案(9页)-原创力文档...
  9. 淘宝2013双12攻略:淘宝卖家双12怎么玩?
  10. codemix java,CodeMix入门基础知识