python的回收机制
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的回收机制的更多相关文章
- python垃圾回收机制与小整数池
python垃圾回收机制 当引用计数为0时,python会删除这个值. 引用计数 x = 10 y = x del x print(y) 10 引用计数+1,引用计数+1,引用计数-1,此时引用计数为 ...
- python垃圾回收机制:引用计数 VS js垃圾回收机制:标记清除
js垃圾回收机制:标记清除 Js具有自动垃圾回收机制.垃圾收集器会按照固定的时间间隔周期性的执行. JS中最常见的垃圾回收方式是标记清除. 工作原理 当变量进入环境时,将这个变量标记为"进入 ...
- 浅析Python垃圾回收机制!
Python垃圾回收机制 目录 Python垃圾回收机制 1. 内存泄露 2. Python什么时候启动垃圾回收机制? 2.1 计数引用 2.2 循环引用 问题:引用计数是0是启动垃圾回收的充要条件吗 ...
- 简述Python垃圾回收机制和常量池的验证
目录 通过代码验证python解释器内部使用了常量池 Python的引入 变量的引入 为什么要有变量 定义变量 常量引入 常量池引入 Python解释器 Python变量存储机制 Python垃圾回收 ...
- 从 CPython 源码角度看 Python 垃圾回收机制
环状双向链表 refchain 在 Python 程序中创建的任何对象都会被放到 refchain 链表中,当创建一个 Python 对象时,内部实际上创建了一些基本的数据: 上一个对象 下一个对象 ...
- python垃圾回收机制的一些理解
概览: 主要通过 引用计数来进行垃圾收集, 就是说,当一个对象没有被其他对象引用的时候,会释放掉内存. 但是会有一些循环引用的对象,通过上面的方法,是没有办法清除掉的.所以,pyt ...
- Python垃圾回收机制详解
一.垃圾回收机制 Python中的垃圾回收是以引用计数为主,分代收集为辅.引用计数的缺陷是循环引用的问题. 在Python中,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存. #e ...
- Python垃圾回收机制 总结
Python 垃圾回收机制 内存管理 Python中的内存管理机制的层次结构提供了4层,其中最底层则是C运行的malloc和free接口,往上的三层才是由Python实现并且维护的,第一层则是在第0层 ...
- python 垃圾回收机制的思考
一.前言 Python 是一门高级语言,使用起来类似于自然语言,开发的时候自然十分方便快捷,原因是Python在背后为我们默默做了很多事情,其中一件就是垃圾回收,来解决内存管理,内存泄漏的问题. 内存 ...
- Python垃圾回收机制--完美讲解!
转自: http://www.jianshu.com/p/1e375fb40506 先来个概述,第二部分的画述才是厉害的. Garbage collection(GC) 现在的高级语言如java,c# ...
随机推荐
- 企业证书安装App
通过苹果自带的浏览器访问:itms-services:///?action=download-manifest&url=https://www.xxxx.com:xxx/xxxx/xxx.pl ...
- threading.Condition()
threading — Thread-based parallelism — Python 3.7.2 documentation https://docs.python.org/3/library/ ...
- Python面试网络编程和并发
1.简述 OSI 七层协议. OSI 开放系统互联参考模型,它是理论的,参考模型 七层:物理层->数据链路层->网络层->传输层->会话层->表示层->应用层 2. ...
- 一致性 hash 算法(转)
add by zhj:介绍了什么是一致性hash,以及实现一致性hash的一种算法. 原文:http://my.oschina.net/u/195065/blog/193614 目录[-] 一致性 h ...
- kubernetes实战(二十):k8s一键部署高可用Prometheus并实现邮件告警
1.基本概念 本次部署使用的是CoreOS的prometheus-operator. 本次部署包含监控etcd集群. 本次部署适用于二进制和kubeadm安装方式. 本次部署适用于k8s v1.10版 ...
- html中载入自执行getElementById("xx")得到null
<!DOCTYPE HTML> <html> <head> <title>Scope Chain & Closure Example </ ...
- idea安装插件
方法1:file>settings>pulgins>browse repositories>输入要安装的插件>install 方法2:本地安装,如果在browse中没有找 ...
- [git]git版本管理学习记录
今天看到别人用这玩意记录自己的进度, 我也学习了一下. 1,适当的工具会提升效率 2,关注点还是得放在代码本身上. github/gitignore github提供了各种gitignore文件 有p ...
- CRM项目总结-封装PortletURLUtil
package com.ebizwindow.crm.utils; import java.security.Key; import java.util.List; import javax.port ...
- c++多线程实例
#include <windows.h> #include <stdio.h> #include <process.h> ; int g_thread_counte ...