1,我们为什么要启用变量

因为我也不确定用户扔给我的数据是什么,有些同学在写程序的时候就已经将变量限定死了,我就说你这样不好,你只想测试一次吗,如果你想确保你的程序万无一失,通俗点说的话,就是“抗揍”,你就要不断的击打它。对于程序,你就要输入不同的数据类型,去测试它。

这里就涉及到变量的绑定,你输入进来的任何的东西我们都可以用一个变量绑定,然后我在编写程序的过程中就可以直接用变量来代替,可能在程序的运行过程中需要创建多个变量,或者多个变量引用一块内存数据。

那么这块内存数据什么时候会被释放呢,这个时候我们要用到引用计数的概念,每减少一个变量,它的引用计数就会减一,为什么要引入对象引用计数的概念,是因为解决内存泄漏问题,当引用计数为零的时候,系统就知道该对象应销毁了,如果此刻对象的引用计数不为零,那么就不能回收这部分资源。

2,引用计数是什么鬼?

Python的GC模块主要运用了引用计数来跟踪和回收垃圾。在引用计数的基础上,还可以通过“标记-清除”解决容器对象可能产生的循环引用的问题。

引用计数有一个很大的优点,即实时性,任何内存,一旦没有指向它的引用,就会被立即回收,而其他的垃圾收集技术必须在某种特殊条件下才能进行无效内存的回收。

通过分代回收以空间换取时间进一步提高垃圾回收的效率。

分代回收它是根据对象存活的生命周期来进行划分的,分为老年代和新生代,老年代的特点是每次回收只有少量对象被回收,而新生代是每次回收都会有更多的对象被回收,

所有新生成的对象都是被划分在新生代中,新生代的目标就是尽可能快速的收集掉那些生命周期短的对象。

因为新产生的对象比较多,新生代使用复制算法,当Minor GC时如果存活对象过多,无法完全放入Survivor区,就会向老年代借用内存存放对象,以完成Minor GC。

可达性分析法类似于树形结构,是用来判断对象是否还存在引用,对于用可达性分析法搜索不到的对象,GC并不一定会回收该对象。

当对象在新生代躲过一次Minor GC的话,其对象年龄便会加1,默认情况下,如果对象年龄达到15岁,就会移动到老年代中。

一般来说,大对象会被直接分配到老年代,所谓的大对象是指需要大量连续存储空间的对象,最常见的一种大对象就是大数组或者长字符串。

而由于老年代的特点是每次回收都只回收少量对象,一般使用的是Mark-Compact算法,这个算法不详细说了,大家对算法感兴趣可以自行百度了解。

3,存在一个永久代

注意,在堆区之外还有一个代就是永久代(Permanet Generation或者说新的metaspace),它用来存储class类、常量、方法描述等。对永久代的回收主要回收两部分内容:废弃常量和无用的类,常量知道吧,就是程序运行过程中不会改变的量。

如果在开发时进行内存泄露检查;在发布时能够确保不会内存泄露,那么就可以延长 Python 的垃圾回收时间间隔、甚至主动关闭垃圾回收机制,从而提高运行效率。

因为运用这种垃圾回收机制也有它的缺点,引用计数机制所带来的维护引用计数的额外操作与Python运行中所进行的内存分配和释放,引用赋值的次数是成正比的

因为对象之间相互引用,每个对象的引用都不会为0,所以这些对象所占用的内存始终都不会被释放掉。

Python中的循环引用不可能存在于不可变对象当中,更多的存在于容器对象当中,比如list、dict、class等等。这也使得该方法带来的开销只依赖于容器对象的的数量

4 浅拷贝和深拷贝

浅拷贝出现冲突问题,因为通过这个变量可以改变嵌套层的绑定情况,这样这个变量被重复引用就会被改得面目全非。

浅拷贝的操作

深拷贝的操作

其实每一个对象都有自己的引用计数,我们如果要解除绑定,用del进行解绑,按照存在的变量找到大对象,然后根据大对象的索引找到里面的小对象,删除以后就会有对象的引用计数减少一个。

deepcopy()和copy()的综合操作

只要有一个变量不绑定对象,对象就会被回收,列表用加等于改变原来的列表,这样操作以后的列表id仍然保持一致,而元组用加等于创建一个新的元组,所以元组加等于操作前后id会不一样。

python的回收机制的更多相关文章

  1. python垃圾回收机制与小整数池

    python垃圾回收机制 当引用计数为0时,python会删除这个值. 引用计数 x = 10 y = x del x print(y) 10 引用计数+1,引用计数+1,引用计数-1,此时引用计数为 ...

  2. python垃圾回收机制:引用计数 VS js垃圾回收机制:标记清除

    js垃圾回收机制:标记清除 Js具有自动垃圾回收机制.垃圾收集器会按照固定的时间间隔周期性的执行. JS中最常见的垃圾回收方式是标记清除. 工作原理 当变量进入环境时,将这个变量标记为"进入 ...

  3. 浅析Python垃圾回收机制!

    Python垃圾回收机制 目录 Python垃圾回收机制 1. 内存泄露 2. Python什么时候启动垃圾回收机制? 2.1 计数引用 2.2 循环引用 问题:引用计数是0是启动垃圾回收的充要条件吗 ...

  4. 简述Python垃圾回收机制和常量池的验证

    目录 通过代码验证python解释器内部使用了常量池 Python的引入 变量的引入 为什么要有变量 定义变量 常量引入 常量池引入 Python解释器 Python变量存储机制 Python垃圾回收 ...

  5. 从 CPython 源码角度看 Python 垃圾回收机制

    环状双向链表 refchain 在 Python 程序中创建的任何对象都会被放到 refchain 链表中,当创建一个 Python 对象时,内部实际上创建了一些基本的数据: 上一个对象 下一个对象 ...

  6. python垃圾回收机制的一些理解

    概览:       主要通过 引用计数来进行垃圾收集, 就是说,当一个对象没有被其他对象引用的时候,会释放掉内存.     但是会有一些循环引用的对象,通过上面的方法,是没有办法清除掉的.所以,pyt ...

  7. Python垃圾回收机制详解

    一.垃圾回收机制 Python中的垃圾回收是以引用计数为主,分代收集为辅.引用计数的缺陷是循环引用的问题. 在Python中,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存. #e ...

  8. Python垃圾回收机制 总结

    Python 垃圾回收机制 内存管理 Python中的内存管理机制的层次结构提供了4层,其中最底层则是C运行的malloc和free接口,往上的三层才是由Python实现并且维护的,第一层则是在第0层 ...

  9. python 垃圾回收机制的思考

    一.前言 Python 是一门高级语言,使用起来类似于自然语言,开发的时候自然十分方便快捷,原因是Python在背后为我们默默做了很多事情,其中一件就是垃圾回收,来解决内存管理,内存泄漏的问题. 内存 ...

  10. Python垃圾回收机制--完美讲解!

    转自: http://www.jianshu.com/p/1e375fb40506 先来个概述,第二部分的画述才是厉害的. Garbage collection(GC) 现在的高级语言如java,c# ...

随机推荐

  1. webpack学习三——output

    output的两个参数filename,path 一.path输出路径,输出路径要绝对路径,否则报错.做法如下: path:__dirname + 'path' 二.filename 输出文件命,相对 ...

  2. mysql 数据库的操作

    1.数据库的查看 1)查看mysql中所有的数据库    "show databases;" mysql> show databases; +---------------- ...

  3. SQL Server中SCAN 和SEEK的区别

    SQL Server中SCAN 和SEEK的区别 SQL SERVER使用扫描(scan)和查找(seek)这两种算法从数据表和索引中读取数据.这两种算法构成了查询的基础,几乎无处不在.Scan会扫描 ...

  4. query:callback

    function getName(callback) { setTimeout(function() { callback('Aaron') }, 1000) } //等待callback回调 get ...

  5. mathtype使用方法

    1:使mathtype中的公式左对齐 双击你的公式,进入mathtype编辑状态.用鼠标选中花括号右边的三行公式,不包括花括号本身,然后点format---matrix---change matrix ...

  6. python——asyncio模块实现协程、异步编程

    我们都知道,现在的服务器开发对于IO调度的优先级控制权已经不再依靠系统,都希望采用协程的方式实现高效的并发任务,如js.lua等在异步协程方面都做的很强大. Python在3.4版本也加入了协程的概念 ...

  7. matplotlib--设置线条颜色及形状

    一.控制颜色 b--blue c--cyan(青色) g--green k--black m--magenta(紫红色) r--red w--white y--yellow 颜色有三种表示方法,可以用 ...

  8. PHP自定义函数返回多个值

    PHP自定义函数只允许用return语句返回一个值,当return执行以后,整个函数的运行就会终止. 有时要求函数返回多个值时,用return是不可以把值一个接一个地输出的. return语句可以返回 ...

  9. SVN 取消版本控制并添加至忽略列表

    忽略已经版本控制的文件忽略文件和目录 起因: 由于项目中的IDE Jdeveloper在某些指定目录下面会生成server.xml以及common文件夹,且包含一个名为bc4j.xcfg的文件,每次当 ...

  10. Android弹性滑动的三种实现方式

    引言 上一篇文章我们介绍了实现弹性滑动的三种方式,但仅仅是给出了代码片段和方法理论.今天我们结合一个具体的例子来谈一下如何使用这三种方法来实现弹性滑动.今天我们的例子是仿IOS的下拉操作,我们知道An ...