1、小整数对象池

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

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

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

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

2、大整数对象池

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

3、intern 机制

a1 = "HelloWorld"
a2 = "HelloWorld"
a3 = "HelloWorld"
a4 = "HelloWorld"
a5 = "HelloWorld"
a6 = "HelloWorld"
a7 = "HelloWorld"
a8 = "HelloWorld"
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

typedef struct_object{
int ob_refcnt;
struct_typeobject *ob_type; } PyProject;

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

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

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

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

  引用计数机制的缺点:

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

    2、循环引用

lst1 = []
lst2 = [] lst1.append(lst2)
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. Python C扩展

    可以用C写一个module,可提供给Python使用. #include <Python.h>#include <stdio.h>void Print_PyObject(PyO ...

  2. jquery 获取 父级 iframe 里的控件对象

    window.parent.document.getElementsByTagName('iframe')[0].contentWindow.document.getElementById('id')

  3. 第二次写linux驱动总结

    第一次写驱动是在去年,2019年十月份左右.当时是看着韦老师的视频一步步完成的.其中经历了很多error.搭建环境花费了很多精力.时间来到了2020年2月19日星期三,韦老师新视频出来了,我跟着再来了 ...

  4. Codeforces Round #579 (Div. 3) 题解

    比赛链接:https://codeforc.es/contest/1203/ A. Circle of Students 题意:\(T\)组询问,每组询问给出\(n\)个数字,问这\(n\)个数字能否 ...

  5. Spark原理概述

    原文来自我的个人网站:http://www.itrensheng.com/archives/Spark_basic_knowledge 一. Spark出现的背景 在Spark出现之前,大数据计算引擎 ...

  6. API接收数据反序列化失败问题查找

    C# API接收到数据后,反序列化后直接返回null,而不会给出错误提示,所以不好排查错误. 通过在api中直接进行反序列化,能够得到错误明细: 没有报错的时候,request会直接为null,不会报 ...

  7. opencv python:直线检测 与 圆检测

    霍夫直线变换介绍 霍夫圆检测 现实中: example import cv2 as cv import numpy as np # 关于霍夫变换的相关知识可以看看这个博客:https://blog.c ...

  8. python中的while

    while循环 循环就是一个重复的过程,不断的重复.while循环又称条件循环 while 条件: code 1 code 2 code 3 ... ##实现ATM的输入密码重新输入的功能 while ...

  9. 高次arccos积分

    \[\Large\displaystyle \int_0^{1} \frac{\arccos^4 \left(x^2\right)}{\sqrt{1-x^2}}\,\mathrm{d}x\] \(\L ...

  10. MySQL 5.5.62 安装方法(标准配置版)

    1.此安装方法适用于绝大多数MySQL版本,首先在MySQL官网上下载好所需版本. 2.(官网可能不太好找)在我的博客列表中有一篇是MySQL官网下载链接,直达下载界面,方便. 3.下载.(安装版  ...