首先要明白对象和引用的概念 (例子:a=1, a为引用,1为对象,对象1的引用计数器为1,b=1此时内存中只有一个对象1,a,b都为引用,对象的引用计数器此时为2,因为有两个引用)

a=1,b=1id(a)=id(b) #短的字符串,数字python在内存中是一个对象

a=[],b=[]

id(a)!=id(b) #字典,数组这样的对象在内存中python会new两个不同的对象

a="new a string"b="new a string" #长的字符串python在内存中同样会new两个不同的对象

id(a)!=id(b)

引用计数器如何减少,当删除该对象的引用时候该对象的引用计数器将会减少。

a=[1,2]

b= [a,a] #a对象的引用计数为2

del b[0] #a对象的引用计数变为1

#字典同理

a=1{"a":a,"b":a} #a对象的引用计数为2

del b[b] #a对象的引用计数变为1

python的垃圾回收(3种)

引用计数

当对象的引用的计数器变为0的时候,该对象可能在内存中,但是已经不能访问。python的垃圾回收时候不能做其他操作,如果一个对象的引用计数变为0的时候python就去回收该对象,那么很显然Python的效率会很差,那什么时候python会来回收呢?这是一个好问题。

python会监听自己new了多少个新的对象和有多少对象的引用计数器变为了,两个数值做差的到的数和阈值去比较,大于阈值,内存开始进行垃圾回收,销毁引用计数器为0的对象。

优点:简单实时性,缺点:维护引用计数消耗资源,循环引用。

分代回收

为了提高效率,有很多对象,清理了很多次他依然存在,可以认为,这样的对象不需要经常回收,可以把它分到不同的集合,每个集合回收的时间间隔不同。简单的说这就是python的分代回收。

具体说一下,python中的垃圾分为1,2,3代,在1代里的对象每次回收都会去清理,当清理后有引用的对象依然存在,此时他会进入2代集合,同理2代集合清理的时候存在的对象会进入2代集合。

每个集合的清理时间如何分配,会先清理1代垃圾,当清理10次一代垃圾后会清理一次2代垃圾,当清理10次2代垃圾后会清理2代垃圾。

标记清除

按需分配,当内存不够的时候,从寄存器和程序栈上的引用出发,遍历对象,将遍历的对象打上标记,然后在内存中清除没有标记的对象。

python的内存机制_python中的内存机制相关推荐

  1. 简述python中的内存管理机制_Python中的内存管理机制

    Python是如何进行内存管理的 python引用了一个内存池(memory pool)机制,即pymalloc机制,用于管理对小块内存的申请和释放 1.介绍 python和其他高级语言一样,会进行自 ...

  2. python算法和数据结构_Python中的数据结构和算法

    python算法和数据结构 To 至 Leonardo da Vinci 达芬奇(Leonardo da Vinci) 介绍 (Introduction) The purpose of this ar ...

  3. linux gdb打印内存命令,gdb中查看内存方法总结

    出自计组第三次上机附加题第二题 用gdb运行程序b,输出中相应地址究竟指向了什么? 请贴上你是如何找到的(使用了什么gdb指令等等) 在查看地址前首先需要断点定位到需要查看的位置 显示代码内容 (gd ...

  4. python中画糖葫芦的代码_Python中的内存管理

    内存管理 包括: ①变量无须事先声明,变量无须指定类型 ②引用计数 ③垃圾回收 ④内存池机制 ①变量定义 不用事先声明变量类型而直接对变量进行赋值.对Python语言来讲,对象的类型和内存都是在运行时 ...

  5. python的内存管理_python如何管理内存?

    介绍 内存管理是有效分配,重新分配和协调内存的过程,以便所有不同的进程都能平稳运行并可以最佳地访问不同的系统资源.内存管理还涉及清除不再访问的对象的内存. 在Python中,内存管理器通过定期运行以清 ...

  6. python的内存泄露_Python 程序的内存泄露,教你一招来解决?

    如果大家在 Linux 或者 macOS 下面运行一段可能导致内存泄露的程序,那么你可能会看到下面这样的情况: 而如果你用的系统是 Windows,那么可能电脑直接就卡死了. 但是,调试这种 OOM( ...

  7. python怎么清理垃圾_Python 中的“垃圾”是怎么回收的?

    前言 对于python来说,一切皆为对象,所有的变量赋值都遵循着对象引用机制.程序在运行的时候,需要在内存中开辟出一块空间,用于存放运行时产生的临时变量:计算完成后,再将结果输出到永久性存储器中.如果 ...

  8. python的回收机制_Python的垃圾回收机制深入分析

    一.概述: Python的GC模块主要运用了"引用计数"(reference counting)来跟踪和回收垃圾.在引用计数的基础上,还可以通过"标记-清除"( ...

  9. python中有指针吗_Python中的指针——到底指什么(一)

    指针是C和C++系语言的重要概念,其本质是保存另一个变量内存地址的变量(Pointers are variables that hold the memory address of another v ...

最新文章

  1. 初级程序员常犯错误一览
  2. Tivoli NetView
  3. spring@PropertySource用法
  4. 关于智能车竞赛总结 | 山东大学(威海) - 山魂五队
  5. POJ - 3281 Dining(最大流+思维建边)
  6. apache.camel_Apache Camel 2.21发布–新增功能
  7. iphone如何查看dns延迟_iPhone手机网速慢?1分钟教你设置DNS,网速立马翻一番
  8. linux set权限,Linux 特殊权限set_uid(示例代码)
  9. Java Web学习总结(12)——使用Session防止表单重复提交
  10. 在weblogic上配置数据源
  11. Java自学要多久?
  12. Ubuntu下搭建UDK2018开发环境
  13. C++实现11平台魔兽全图外挂
  14. 如何批量制作ITF-14条码
  15. Importing the numpy C-extensions failed.
  16. 云知声开源全栈语音交互方案
  17. 提取IP地址和端口的正则表达式
  18. 苏格拉底和柏拉图甩手的故事
  19. UNITY之EventTrigger,EventListener
  20. Gitea在windows平台的安装和简单使用教程

热门文章

  1. 【redis】三种redis数据导出导入方式
  2. 【java】高并发之限流 RateLimiter使用
  3. git status或者 git commit 中文文件显示乱码
  4. 【Jenkins】Jenkins : jenkins-2.121.1 安装 与 使用
  5. flink 1.9.0 编译:flink-fs-hadoop-shaded 找不到
  6. linux的bash脚本
  7. shell 编程-Expect
  8. 一文看懂JUC之AQS机制
  9. idea中报文件Not Found
  10. Zookeeper的一次启动失败问题解决