内存使用

程序在运行的过程需要开辟内存空间,比如创建一个对象需要一片内存空间,定义变量需要内存空间。有内存的开辟,势必也要有内存的释放,不然只进不出那不是貔貅了吗?即使有开辟有释放在短期内还是会有垃圾内存的存在。

内存管理

在有些语言中,内存的开辟和回收需要在代码中完成,典型的例子就是C语言。C语言中开辟一块内存:ptr=(int*)malloc(sizeof(int)*n); 释放一块内存:free(ptr);这个过程是需要写在内存使用之前的程序中的(没有轮子怎么办,咱们自己造)。而Java,Python这类语言内存的开辟和回收不需要代码实现,在后台中有专门负责内存回收的机制GC。

python中使用的垃圾回收机制有两个:

1.引用计数,标记清除

2.隔代回收

引用计数,标记清除

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

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

PyObject是每个对象必有的内容,其中ob_refcnt就是做为引用计数。当一个对象有新的引用时,它的ob_refcnt就会增加,当引用它的对象被删除,它的ob_refcnt就会减少

#define Py_INCREF(op)   ((op)->ob_refcnt++) //增加计数
#define Py_DECREF(op) \ //减少计数
if (--(op)->ob_refcnt != ) \
; \
else \
__Py_Dealloc((PyObject *)(op))

创建对象时Python立即向操作系统请求内存,同时Python将对象的C结构体里的 ob_refcnt 的值设为1。

如果对变量a重新赋值,此时变量a就会指向一个新的对象,新对象的引用数值为1,旧对象引用计数的值就会被置成0。

当python 的垃圾回收机制发现内存中的对象的计数引用值为0时,它就发现该自己闪亮登场了。垃圾回收机制会销毁该对象,释放内存。

引用计数,标记清除这一招是十分奏效的,可以解决大部分的对象回收。但是就是有那么一些情况是这一招解决不了的,那就是循环引用。所谓循环应用指的是两个对象互相引用,且成为了一个孤岛,没有别的对象关联。

这种情况下,引用计数值一直都是1,想要释放 ’tommorr‘ 不行,因为它被 ’another‘引用了,所以要先释放 ’another‘才能使用 ’tommor‘,但是’another‘又被tommorr引用,也无法释放。这该怎么办呢?这时需要python垃圾回收的第二个机制 隔代回收出马了。

隔代回收

隔代回收机制主要3板斧:

第一:所有创建的对象都会加入到零代链表中,并扫描零代链表中所有的循环引用。如图发现两个对象的循环引用。

第二:将发现的循环引用的引用计数都减1。

当循环引用计数值为0之后,就被标记清除,垃圾回收第一规则就生效。如果清除一次引用计数还不为0咋办呢?那就是第三步

第三步:将零代中引用计数不为0的对象加入到一代链表中,在一代链表中会重复零代中的循环计数减1操作。同时如果生命力顽强到一代链表都没处理的,那么会加入到二代链表。

以上讲到的是垃圾回收机制的大体思路,其实python的垃圾回收机制比以上描述的要复杂很多,很多深奥的东西可以看篇文章:https://www.cnblogs.com/pinganzi/p/6646742.html

python进阶之垃圾回收的更多相关文章

  1. Python中的垃圾回收与del语句

    python中的垃圾回收采用计数算法 一个对象如果被引用N次,则需要N次(即计算引用次数为零时)执行del 才能回收此对象. a = 100 b = a del a print(b) print(a) ...

  2. Python中的垃圾回收机制

    Python的垃圾回收机制 引子: 我们定义变量会申请内存空间来存放变量的值,而内存的容量是有限的,当一个变量值没有用了(简称垃圾)就应该将其占用的内存给回收掉,而变量名是访问到变量值的唯一方式,所以 ...

  3. python del和垃圾回收

    1. del是删除对象 2. python中的垃圾回收是删除引用计数

  4. python内存管理&垃圾回收

    python内存管理&垃圾回收 引用计数器 环装双向列表refchain 在python程序中创建的任何对象都会放在refchain连表中 name = '张三' age = 18 hobby ...

  5. 【转载】Python中的垃圾回收机制

    GC作为现代编程语言的自动内存管理机制,专注于两件事:1. 找到内存中无用的垃圾资源 2. 清除这些垃圾并把内存让出来给其他对象使用.GC彻底把程序员从资源管理的重担中解放出来,让他们有更多的时间放在 ...

  6. Python 中的垃圾回收机制--备忘

    GC作为现代编程语言的自动内存管理机制,专注于两件事:1. 找到内存中无用的垃圾资源 2. 清除这些垃圾并把内存让出来给其他对象使用.GC彻底把程序员从资源管理的重担中解放出来,让他们有更多的时间放在 ...

  7. Python 中的垃圾回收机制(转载)

    from: https://foofish.net/python-gc.html GC作为现代编程语言的自动内存管理机制,专注于两件事:1. 找到内存中无用的垃圾资源 2. 清除这些垃圾并把内存让出来 ...

  8. python对象销毁(垃圾回收)

    Python 使用了引用计数这一简单技术来跟踪和回收垃圾. 在 Python 内部记录着所有使用中的对象各有多少引用. 一个内部跟踪变量,称为一个引用计数器. 当对象被创建时, 就创建了一个引用计数, ...

  9. Python中的垃圾回收机制(转)

    原文:https://foofish.net/python-gc.html GC作为现代编程语言的自动内存管理机制,专注于两件事:1. 找到内存中无用的垃圾资源 2. 清除这些垃圾并把内存让出来给其他 ...

随机推荐

  1. NETGEAR R7800路由器TFTP刷回原厂固件方法

    前几天因图新鲜将用了一年的R7800刷为dd-wrt固件,结果发现信号覆盖和网络速率相对于原厂固件还有一些差距. 然后从dd-wrt固件刷回原厂,具体操作过程如下: 1.到NETGEAR官网[支持]模 ...

  2. 如何抓取 framework input 事件相关 log

    出现事件输入相关的问题时, 建议先 followhttp://429564140.iteye.com/blog/2355405来检测对应的设备是否有响应输入 如果没有响应输入,则可能是 driver ...

  3. C# SendAysnc 超时

      业务方法 @@@code public override async Task<List<(IPEndPoint endPoint, byte[] data)>> Send ...

  4. shell编程之case分支语句

    shell编程之case分支语句 case分支语句和if的多分支语句很相似. if多分支语句一般用在有(区间范围)的地方 :例如:0-100之间. if需要判断多个不同的条件. case的分支语句用在 ...

  5. python 基础学习笔记(6)--函数(1)

    ## **函数(1)** **函数的定义:** 1. [ ] 小时候大家应该都玩过乐高积木,只要通过想象和创意,可以用它怕拼凑出很多神奇的东西.随着学习的深入,编写的代码日益增加并且越来越复杂,所以需 ...

  6. django的使用INNODE的方式,排除错误MySQL Strict Mode is not set for database connection 'default'

    出现如下错误: 解决办法: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mxshop', 'HO ...

  7. 原创【cocos2d-x】CCMenuItemToggle 在lua中的使用

    说明:1,所使用的cocos2dx版本为2.1.3 ;09:48:05 2,本人仍是在学习中的小菜鸟,此博客只是为了记录我学习过程中的点滴,同时也希望同样lua开发的童鞋,一起交流: 3,本人whj0 ...

  8. 利用Haproxy搭建 HTTP 请求走私(Request smuggling)环境

    Haproxy 介绍 HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性.负载均衡,以及基于TCP和HTTP的应用程序代理. 请求走私(Request smuggling)概念证 ...

  9. linux/kali安装及更新源以及输入法等配置

    准备工作1.kali 镜像的下载,官网选择对应的版本下载https://www.kali.org/downloads/ 2.VMware的安装,同官网可下载 更新源总结#更新源gedit /etc/a ...

  10. java之Objects类

    Objects类概述 在JDK7添加了一个Objects工具类,它提供了一些方法来操作对象,它由一些静态的实用方法组成,这些方法是null-save(空指针安全的)或null-tolerant(容忍空 ...