一、前言

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

内存泄漏:当程序不停运行,有一部分对象没有作用,但所占内存没有被释放,服务器内存随时间越来越少,最终导致系统的崩溃,所以内存泄漏是一个需要重点关注的问题。

Java垃圾回收 半自动 只买新的 不用管扔垃圾
Python全自动 【引用计数,分代回收】
二、python的垃圾回收机制包括引用计数、循环引用,那么我们通过什么来解决呢,下面讲一下。

2.1 引用计数

Python 标记一个对象是否还有用的方法就是用引用计数,以下情形会为该对象的计数+1:

创建时
被引用时
作为参数传入函数时
相反,以下情形会为该对象的计数-1:

被del
被重引用
函数执行完毕
查看某一元素的计数可以通过 sys.getrefcount(),当引用计数为0 的时候,内存就会被释放。

可以想到和其他垃圾回收相比,Python的机制优点很明显,就是实时性,Python的gc 模块就是开放的接口用以管理。

也可以很容易猜到这样的缺点就是性能相对较低,看过这样的报道,instagram 通过禁用 gc 模块,性能提升10%!

2.2 循环引用

有一种特殊情况,当两个或多个变量互相循环引用的时候,按照计数引用的机制就无法处理了

Python

a = []

b = []

a.append(b)

b.append(a)

print(a,b)

a,b 的引用计数均为2,无法回收两者内存

2.3 解决方案

通过 ”标记-清除“ 来解决循环调用问题:
垃圾回收器定时去寻找这类循环调用,并清除

具体是 先从 根对象集合副本中 开始寻找,这些对象计数不为0,没有被清除

然后一个个检测,将其分为可达对象和不可达对象,底层通过链表的数据结构实现,通过操作副本清除标记,来在不影响原数据的情况下,判断是否为循环调用

最后将不可达对象清除,释放内存,效率较低。

有三种情况会触发垃圾回收:

1.调用gc.collect(),

2.当gc模块的计数器达到阀值的时候。

3.程序退出的时候

2.分代回收,利用 “空间换时间”策略提高效率:

有些内存块生存时间从开始到结束,有些则很短,所以同样对他们进行垃圾回收是很浪费的一件事情,

所有对象开始被划分到零代中,Python 默认 有三代,一个代就是一个链表

年轻代中的对象优先处理,经历垃圾处理次数愈多的,越“老” ,就会上升,最终放在第二代中。

需要研究:

Python的垃圾回收机制是通过检测数量是否到达阈值来决定是否进行。

gc模块

补充:语录
C中指针之类的 其实是操作系统的概念 c的抽象程度和os同级别
C是os的好基友
因此c的难度不在于困惑人的语法
本质上是os复杂度的延伸
Python作为动态语言 抽象程度更高 没有指针这种东西
树上算法 遍历之类的 离不开树
递归回溯和分治是初学者最容易困惑的
比如图论算法离不开图的数据结构
数据结构方便存 根本上还是方便算。

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

  1. 详解python的垃圾回收机制

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

  2. 谈一谈python的垃圾回收机制

    [python的垃圾回收机制是怎么实现的] 在C语言时代程序员要负责内存的申请和释放,虽然这样的程序可以对资源进行精细的控制.但是它也有它的问题.这就要求程序员 要写许多与业务逻辑无关的内容在代码里面 ...

  3. python的垃圾回收机制和析构函数__del__

    析构函数__del__定义:在类里定义,如果不定义,Python 会在后台提供默认析构函数. 析构函数__del__调用: A.使用del 显式的调用析构函数删除对象时:del对象名: class F ...

  4. Python核心技术与实战——二十|Python的垃圾回收机制

    今天要讲的是Python的垃圾回收机制 众所周知,我们现在的计算机都是图灵架构.图灵架构的本质,就是一条无限长的纸带,对应着我们的存储器.随着寄存器.异失性存储器(内存)和永久性存储器(硬盘)的出现, ...

  5. Python的 垃圾回收机制

    垃圾回收 1. 小整数对象池 整数在程序中的使用非常广泛,Python为了优化速度,使用了小整数对象池, 避免为整数频繁申请和销毁内存空间. Python 对小整数的定义是 [-5, 257) 这些整 ...

  6. Python的垃圾回收机制

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

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

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

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

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

  9. python中垃圾回收机制

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

随机推荐

  1. Linux上用nginx搭建RTMP服务器

    参考文章:https://obsproject.com/forum/resources/how-to-set-up-your-own-private-rtmp-server-using-nginx.5 ...

  2. shell ## %% 使用说明

    path='apps/home/usr/app/test.txt' a=${path##*/} b=${path#*/} c=${path%%/*} d=${path%/*}············· ...

  3. 【转】 Pro Android学习笔记(六八):HTTP服务(2):HTTP POST

    目录(?)[-] 找一个测试网站 HTTP POST小例子 上次学习了HTTP GET请求,这次学习一下HTTP POST. 找一个测试网站 小例子好写,但要找个测试网站就有些麻烦,一下子无从入手,都 ...

  4. 【转】 Pro Android学习笔记(十九):用户界面和控制(7):ListView

    目录(?)[-] 点击List的item触发 添加其他控件以及获取item数据 ListView控件以垂直布局方式显示子view.系统的android.app.ListActivity已经实现了一个只 ...

  5. java流类

    总结:new FileInputStream package com.ds; import java.io.*; import com.da.fgbv; public class rter { pub ...

  6. js实现翻牌效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. Java 编程规范,常见规范,命名规范,复杂度

    方法/步骤     1. *不允许把多个短语句写在一行中,即一行只写一条语句 1. 示例:如下例子不符合规范. LogFilename now = null;        LogFilename t ...

  8. VisualGDB系列5:使用VS来开发Linux程序

    根据VisualGDB官网(https://visualgdb.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指正. 本文演示如何使用VS来构建和调试Linu ...

  9. stm32与三菱PLC通信

    一.三菱PLC通讯概要   三菱PLC FX系列通信结构如下图所示: 三菱PLC FX系列的通信规格如下图所示: 三菱PLC FX系列一般有以下几种通信模块,以FX2N为例: FX2N-232-BD ...

  10. k8s 基础 pod创建流程

    Pod是Kubernetes中最基本的部署调度单元,可以包含container,逻辑上表示某种应用的一个实例.例如一个web站点应用由前端.后端及数据库构建而成,这三个组件将运行在各自的容器中,那么我 ...