1、小整数对象池

整数在程序中的使用非常广泛,python 为了优化速度,使用了小整数对象池,避免整数频繁申请和销毁和内存空间。

Python 对小整数的定义事【-5, 257】这些整数对象的hi提前建立好的 ,不会被垃圾回收,在一个 Python 的程序中,所有位于这个范围的整数使用的都是同一个对象。

同理,单个字母也是这样的。

但是当定义2个相同的字符串时,应用计数为0,触发垃圾回收。

2、大整数对象池

每一个大整数对象,均创建一个新的对象。

3、intern 机制

  1. a1 = "HelloWorld"
  2. a2 = "HelloWorld"
  3. a3 = "HelloWorld"
  4. a4 = "HelloWorld"
  5. a5 = "HelloWorld"
  6. a6 = "HelloWorld"
  7. a7 = "HelloWorld"
  8. a8 = "HelloWorld"
  9. a9 = "HelloWorld

Python 会不会创建 9 个对象呢?

 在内存中会不会开辟 9 个 “HelloWorld”的内存空间呢?
想一下?

如果时这样的话,我们写了 10000 个对象,比如 a1 = ‘HelloWorld’   a10000 = ‘HelloWorld’ ,这样的话已不是开辟了 10000 个‘HelloWorld’ 所占的内存空间了呢?

如果真是这样,内存早就爆了,所以 Python 中这样一个机制 ----- intern 机制,让它占用一个 'HelloWorld' 所占的空间,靠引用计数去维护何时释放。

总结:

  1、小整数[-5, 257] 共用对象,常驻内存

  2、单个字符公用对象,常驻内存

  3、单个单词,不可修改,默认开启 intern 机制,共用对象, 引用计数为0, 则销毁

垃圾回收(二)

1、Garbage collection(GC垃圾回收)

  现在高级语言如java ,C#等都采用了垃圾回收机制,而不是 c,c++里用户自己管理维护没存的方式,自己管理内存极其自由,可以任意申请内存,但如同一把双刃剑,为大量的内存泄漏,悬空指针埋下了隐患。遂于一个字符串、列表、类甚至数值都是对象,且定位简单易用的怨言,自然不会让用户自己处理如何回收内存的问题,python 里也同 java 一样采用了垃圾回收机制,不过不一样的时:python 采用的时引用计数计数机制为主,标记-消除和分代收集两种机制的策略

引用计数机制:

python里每一个东西都是对象,他们的核心就是一个结构体: PyProject

  1. typedef struct_object{
  2. int ob_refcnt;
  3. struct_typeobject *ob_type;
  4.  
  5. } PyProject;

PyProject 是每个对象必有的内容,其中 ob_refcnt就是作为引用计数。当一个随想有新的引用时,他的 ob_refcnt就i会增加,当引用它的对象v欸删除时,它的ob_reflcnt 就会减少;

当引用计数为 0 时,改对象就结束了

引用计数的机制的优点:
  1、简单

  2、实时性、一旦没有了引用,内存就直接释放了,不用像其他机制等到特定时机,实时性还带来一个好处:处理回收内存的时间分摊到平时

  引用计数机制的缺点:

    1、维护引用计数消耗资源

    2、循环引用

  1. lst1 = []
  2. lst2 = []
  3.  
  4. lst1.append(lst2)
  5. lst2.append(lst1)

lst1和 lst2 相互引用,如果不存在其他对象对他们的引用,lst1与lst2的引用计数也任然为 1,所占用的内存永远无法回收,这将时致命的。对于如今的强大硬件,缺点1尚可接受,但是循环引用导致内存泄漏,注定Python还将引用如夫人回收机制(标记清楚和分代收集)

GC系统所承担的工作远比“垃圾回收”多得多,实际上,他们负责三个重要任务

  1、为新生对象分配内存

  2、识别那些是垃圾对象

  3、从垃圾对象中回收内存

如果将应用程序比作人的身体,所有你写的优雅的代码、业务逻辑,算法,应该就是大脑,依次类推,垃圾回收机制应该是身体的那个器官呢?

腰子没有了人还能活好像 可是对于java、C# 这样的高级语言 没有GC的话 是不是就不行  当然不行 那腰子机制不成立 白血球 嗯也不行 ok 心脏行不行 当然可以 哈哈 如果垃圾回收器停止或者行动迟缓 那内存会不会爆满 会不会 会还不是不会  那好 像动脉阻塞或者心脏停跳   难道不应该是人工呼吸吗 是吗 还有必要吗  哦闹

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

  1. Python的垃圾回收机制

    Python的GC模块主要运用了“引用计数”(reference counting)来跟踪和回收垃圾.在引用计数的基础上,还可以通过“标记-清除”(mark and sweep)解决容器对象可能产生的 ...

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

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

  3. Python垃圾回收机制

    引用计数Python默认的垃圾收集机制是“引用计数”,每个对象维护了一个ob_ref字段.它的优点是机制简单,当新的引用指向该对象时,引用计数 引用计数 Python默认的垃圾收集机制是“引用计数”, ...

  4. Python垃圾回收机制详解

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

  5. Python垃圾回收机制 总结

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

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

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

  7. 【Python】 垃圾回收机制和gc模块

    垃圾回收机制和gc模块 Py的一个大好处,就是灵活的变量声明和动态变量类型.虽然这使得学习py起来非常方便快捷,但是同时也带来了py在性能上的一些不足.其中相关内存比较主要的一点就是py不会对已经销毁 ...

  8. Python的垃圾回收机制(引用计数+标记清除+分代回收)

    一.写在前面: 我们都知道Python一种面向对象的脚本语言,对象是Python中非常重要的一个概念.在Python中数字是对象,字符串是对象,任何事物都是对象,而它们的核心就是一个结构体--PyOb ...

  9. python之MRO和垃圾回收机制

    一.MOR 1.C3算法简介 为了解决原来基于深度优先搜索算法不满足本地优先级,和单调性的问题. python2.3版本之后不管是新式类还是经典类,查找继承顺序都采用C3算法 2.算法原理 C3算法的 ...

随机推荐

  1. Oracle expdp 多表导出处理

    一个项目中需要在oracle数据库某个用户下导出1000多个表,导入到测试库做数据分析测试.很少遇到需要导出这么多表的情况,通常都是按schema导出,或者整库导出.考虑到expdp中include参 ...

  2. yii2 password hash生成与验证方法

    1.生成 $password是明文.如:123456 $this->password_hash = Yii::$app->security->generatePasswordHash ...

  3. java spring-boot 服务器启动参数设置

    java -jar -Xms5866m -Xmx5866m -Xss256k -Xloggc:/home/work/spring-boot/logs/gc-%t.log -XX:+UseGCLogFi ...

  4. oracle备份报“EXP-00056: 遇到 ORACLE 错误 12541”

    今天准备接手一个新项目,首先是dang项目和备份数据库到本地,但是在备份数据库的时候报错误: EXP-00056: 遇到 ORACLE 错误 12541 ORA-12541: TNS: 无监听程序 E ...

  5. LoadRunner通过webservice协议调用WSDL接口时,返回值不正确

    有可能是某些传参空的值导致的. 解决办法:注释掉空值传参.或者将其值转变为true ”ProductIDSpecified=true“,

  6. WLC配置LAG

    在一般的网络环境中,为了让网络更加的可靠,冗余性更好,会对WLC和对端的设备配置LAG. 如下是一个基本的示例topo(VSS的情况下建议的连接方式): 一般情况下的连接方式: 一般来说配置比较简单, ...

  7. springboot多模块项目打war包

    一.父模块配置 1,指定pakaging:pom 2,指定编译的版本:如下图: <properties> <project.build.sourceEncoding>UTF-8 ...

  8. Java数组和方法

    1. 数组可以作为方法的参数 package cn.itcast.day05.demo04; /* 数组可以作为方法的参数. 当调用方法的时候,向方法的小括号进行传参,传递进去的其实是数组的地址值. ...

  9. iOS 实现 摇一摇

    摇一摇功能:调用了系统自带加速器,当设备摇动时,系统会 计算出加速器的加速值,然后告诉设备是否发生摇动手势,系统只会运动开始和结束时通知你,并不会在运动发生的整个过程中始终向你报告每一次运动.例如,你 ...

  10. ASP.NET Core搭建多层网站架构【8.3-编写角色业务的增删改】

    2020/01/29, ASP.NET Core 3.1, VS2019 摘要:基于ASP.NET Core 3.1 WebApi搭建后端多层网站架构[8.3-编写角色业务的增删改] 编写最简单的增删 ...