垃圾回收机制GC
垃圾回收机制GC
我们已经知道,name = 'leethon'这一赋值变量的操作,是将变量与数据值相绑定。
而数据值是存储到内存中的,有时变量会重新赋值即绑定其他数据值,而使得原本的数据值无法通过变量找到,那么它存储到内存中就变得没有意义,如果这样被变量抛弃的数据值过多,就会占用内存过多的资源。
这样无法通过变量找到的数据值,我们称之为‘垃圾’,而在python语言中,会自动的回收这些垃圾,而回收的逻辑原理有十二字真言:引用计数、标记清除、分代回收
引用计数
引用计数的原理是,数据值每绑定一个变量,其引用计数就会增加1,每解除一个变量绑定,引用计数就会减去1,当一个数据值的引用计数为0时,则会被当成垃圾回收掉。这样就简单的实现了垃圾数据的回收。
# 比如我们进行以下两句代码的执行
变量1 = 数据值1 # 数据值1为新值,引用计数为1
变量1 = 数据值2 # 数据值2为新值,引用计数为1,数据值1被迫与变量1断开连接,引用计数-1清零

标记清除
标记清除主要是用于解决循环引用的问题。
首先,我们先说明一下,哪些状况下,会使引用计数增加:
- 被变量绑定时
- 被列表索引和字典键索引时
那么又在什么情况下,引用计数会减少呢:
- 变量重新赋值或del时与数据值断开绑定
- 索引的列表或字典等被回收时,自然也会断开与其引用数据的绑定
那么可以看到,引用计数来解决垃圾问题是有隐患的,那就是循环引用问题
# 看以下一段程序
l1 = ['a'] # 两变量分别绑定了一个列表
l2 = ['b'] # 两个不同的列表分别引用计数为1
l1.append(l2) # l1 = ['a', l2] 列表2的引用计数加为2
l2.append(l1) # l2 = ['b', l1] 列表1的引用计数加为1
del l1 # l1变量断开,列表1引用计数-1
del l2 # l2变量断开,列表2引用计数-1
如图所示:

会发现,最终内存中的数据值,虽然两个列表相互引用,但是已经没有变量能够找到这两个数据值了,符合‘垃圾’的定义,但是却没有被回收。
于是,有一个机制,当内存占用临界时,程序会停止运行,扫描程序中的所有数据,把产生循环的数据打上标记,最后清除掉,名为标记清除。
分代回收
标记清除的频繁运行,会导致程序运行的不通畅,于是我们还需要一个机制,来减少标记清除的次数,且依然能达到清理垃圾的效果。
比起一次性扫描所有数据,一次性扫描少量数据,显然对程序执行的影响比较小。
而对于新产生的数据采用较频繁的扫描,对于多次扫描都为发现标记的数据,则认为是不易产生循环引用的数据,采取频率较低的扫描检查,这个就叫分代回收。

垃圾回收机制GC的更多相关文章
- 垃圾回收机制GC知识再总结兼谈如何用好GC
一.为什么需要GC 应用程序对资源操作,通常简单分为以下几个步骤: 1.为对应的资源分配内存 2.初始化内存 3.使用资源 4.清理资源 5.释放内存 应用程序对资源(内存使用)管理的方式,常见的一般 ...
- 垃圾回收机制GC知识再总结兼谈如何用好GC(转)
作者:Jeff Wong 出处:http://jeffwongishandsome.cnblogs.com/ 本文版权归作者和博客园共有,欢迎围观转载.转载时请您务必在文章明显位置给出原文链接,谢谢您 ...
- 垃圾回收机制GC知识再总结兼谈如何用好GC(其他信息: 内存不足)
来源 图像操作,易内存泄露,边界像素 一.为什么需要GC 应用程序对资源操作,通常简单分为以下几个步骤: 1.为对应的资源分配内存 2.初始化内存 3.使用资源 4.清理资源 5.释放内存 应用程序对 ...
- .NET 之 垃圾回收机制GC
一.GC的必要性 1.应用程序对资源操作,通常简单分为以下几个步骤:为对应的资源分配内存 → 初始化内存 → 使用资源 → 清理资源 → 释放内存. 2.应用程序对资源(内存使用)管理的方式,常见的一 ...
- C#垃圾回收机制(GC)
GC的前世与今生 虽然本文是以.net作为目标来讲述GC,但是GC的概念并非才诞生不久.早在1958年,由鼎鼎大名的图林奖得主John McCarthy所实现的Lisp语言就已经提供了GC的功能,这是 ...
- java垃圾回收机制GC
记得第一次总结java 的GC的时候,是刚开始在课堂上学习GC的时候,那时候许老师第一节java课 课后老师说同学们可以去深入理解一下java的GC机制: 但是是花费了三四个小时,翻看了<Thi ...
- 【C#复习总结】垃圾回收机制(GC)2
理解C#垃圾回收机制我们首先说一下CLR(公共语言运行时,Common Language Runtime)它和Java虚拟机一样是一个运行时环境,核心功能包括:内存管理.程序集加载.安全性.异步处理和 ...
- 【C#复习总结】垃圾回收机制(GC)1
摘要:今天我们漫谈C#中的垃圾回收机制,本文将从垃圾回收机制的原理讲起,希望对大家有所帮助. GC的前世与今生 虽然本文是以.NET作为目标来讲述GC,但是GC的概念并非才诞生不久.早在1958年,由 ...
- JVM与垃圾回收机制(GC)和类的生命周期
JVM运行时数据区 GC(垃圾回收机制) 什么是垃圾回收机制: 在系统运行过程中,会产生一些无用的对象,这些对象占据着一定的内存,如果不对这些对象清理回收无用的是对象,可能会导致内存的耗尽,所以垃圾回 ...
随机推荐
- CF1593D2 Half of Same
题目大意: 给定一个包含 \(n\)(\(n\) 是偶数)个整数的数列 \(a_1,a_2,\ldots,a_n\). 考虑一个可能的正整数 \(k\),在每次操作中,你可以选定一个 \(i\),并将 ...
- for循环和while循环dowhile循环
第四章 循环语句 4.1循环概述 循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段代码被重复执行的代码被称为循环体语句,当反复执行这个循环体的时候,需要在核实的时候吧循环判断条件修改为fa ...
- 手把手带你实现基于 Vite+Vue3 的在线Excel表格系统
今天,葡萄带你了解如何基于Vite+Vue3实现一套纯前端在线表格系统. 在正式开始项目介绍之前,首先咱们首先来介绍一下Vite和Vue3. Vue3 2020年09月18日Vue.js 3.0发布, ...
- python 操作json数据
简介 JSON(JavaScript Object Notation, JS对象简谱)是一种轻量级的数据交换格式,通常是以键值对的方式呈现,其简洁和清晰的层次结构使得JSON成为理想的数据交换语言,而 ...
- ASP.NET Core 6框架揭秘实例演示[30]:利用路由开发REST API
借助路由系统提供的请求URL模式与对应终结点之间的映射关系,我们可以将具有相同URL模式的请求分发给与之匹配的终结点进行处理.ASP.NET的路由是通过EndpointRoutingMiddlewar ...
- 强大博客搭建全过程(1)-hexo博客搭建保姆级教程
1. 前言 本人本来使用国内的开源项目solo搭建了博客,但感觉1核CPU2G内存的服务器,还是稍微有点重,包括服务器内还搭建了数据库.如果自己开发然后搭建,耗费时间又比较多,于是乎开始寻找轻量型的博 ...
- tomcat线程池
tomcat线程池和普通的线程池设计上有所区别,下面主要来看看它是如何设计的 tomcat中线程池的创建 org.apache.tomcat.util.net.AbstractEndpoint#cre ...
- ceph 005 赋权补充 rbd块映射
我的ceph版本 [root@serverc ~]# ceph -v ceph version 16.2.0-117.el8cp (0e34bb74700060ebfaa22d99b7d2cdc037 ...
- 使用 Vue.js 框架后的感想
前言 用 Vue 已经有段时间了,把自己的所想所悟写下来,每一个想法都是非常宝贵的,记录成为生活,记录成为习惯. 简化开发 Vue 是可以辅助前端工程师开发 Web App 的一种框架,它节省很多时间 ...
- PerfView专题 (第八篇):洞察 C# 内存泄漏之寻找静态变量名和GC模式
一:背景 这篇我们来聊一下 PerfView 在协助 WinDbg 分析 Dump 过程中的两个超实用技巧,可能会帮助我们快速定位最后的问题,主要有如下两块: 洞察内存泄漏中的静态大集合变量名. 验证 ...