美文网首页Python七号
Python 内存中的垃圾回收

Python 内存中的垃圾回收

作者: somenzz | 来源:发表于2019-07-03 23:55 被阅读6次

绝大多数通常情况下,Python 程序员无需像 C 程序员那样手动管理内存,Python 解释器会自动进行垃圾回收。虽然不需要手动管理内存,但知道了 Python 内存中的垃圾回收的原理,可以避免写出内存溢出(OOM out of memory)的程序。

Python 解释器是怎么自动进行垃圾回收的呢? 两种方案:

  1. 当引用计数为 0 时,执行垃圾回收。

Python 的世界里,万物皆对象,我们所定义的变量,都是对象的一个引用,当有对象指向一个对象时,引用计数就增加 1,当一个变量的生命周期结束时,比如函数调用完毕时,引用计数就会减少,当引用计数为 0 时, Python 解释器自动进行对变量进行垃圾回收。

  1. 当出现互相引用时,执行垃圾回收。

Python 使用标记清除算法和分代收集算,来启用针对循环引用的自动垃圾回收,这一点我也不是很熟悉,极客上的老师是这么解释的:

先来看标记清除算法。我们先用图论来理解不可达的概念。对于一个有向图,如果从一个节点出发进行遍历,并标记其经过的所有节点,那么在遍历结束后,所有没有被标记的节点,我们就称之为不可达节点。显而易见,这些节点的存在是没有任何意义的,自然,我们就需要对它们进行垃圾回收。

当然,每次遍历全图,对于 Python 而言是一种巨大的浪费。所以在 Python 的垃圾回收实现中,标记清除算法使用双向链表维护一个数据结构,并且只考虑容器类的对象(只有容器类的对象才有可能出现循环引用),而分代收集算法,则是另外一个优化手段。

Python 将所有对象分为三代。刚刚创立的对象是第 0 代,经过一次垃圾回收后,依然存在的对象,便会从上一代挪到下一代。而每一代启动自动垃圾回收的阈值,则是可以单独指定的。当垃圾回收器中新增对象减去删除对象达到相应的阈值时,就会对这一代对象启动垃圾回收。

事实上,分代收集基于的思想是,新生的对象更有可能被垃圾回收,而存活更久的对象也有更高的概率继续存活,因此这种做不不仅节省计算量,更提高 Python 的性能。

能否手动管理内存

当然可以,执行以下语句就可以释放变量 a 占用的内存空间:

import gc
a=[1,2,3,45]
del a
gc.collect()

调用 del a 来删除一个对象,调用 gc.collect() 来手动启用垃圾回收。

(完)

相关文章

  • 5.5-GC、分支、循环

    1.垃圾回收GC(内存管理)——JAVA核心思想 当Python中的对象越来越多,占据越来越大的内存,启动垃圾回收...

  • python拾遗7 - 垃圾回收

    垃圾回收机制 相比 C++ 的手动回收内存,python 的垃圾回收机制可谓是省心省力,判断是否回收一块内存,主要...

  • python必知必会12

    Python 的内存机制 内存机制主要包括垃圾收集和内存管理两部分。Python 主要使用基于引用计数的垃圾回收机...

  • Python 内存中的垃圾回收

    绝大多数通常情况下,Python 程序员无需像 C 程序员那样手动管理内存,Python 解释器会自动进行垃圾回收...

  • 《深入理解Java虚拟机》(二)--垃圾收集器与内存分配策略(3

    垃圾收集器 如果垃圾收集算法是内存回收的方法论,垃圾回收器就是内存回收的具体实现。JVM规范中没有对垃圾回收器的任...

  • JVM - GC

    GC:垃圾回收 Q1:为什么要垃圾回收? 为了腾出内存给其他对象。 Q2:回收谁?(谁是垃圾?) 堆内存中,没有被...

  • 深入JVM-垃圾回收概念与算法

    一、认识垃圾回收 谈到垃圾回收(Garbage Collection,简称GC),GC中的垃圾,特指存在于内存中的...

  • 2018-11-19 python学习第三天

    1、内存回收机制: 在其他语言中需要考虑内存回收机制,垃圾数据太多会导致内存溢出。但是python语言无需考虑这点...

  • 【Java垃圾回收器分析】

    前言 垃圾回收器需要回收内存中的数据,以便保持内存一直处于可用状态。但是垃圾回收如何选择哪些数据对象需要回收,哪些...

  • python学习一

    1 python 如何管理内存 对象引用计数机制,垃圾回收机制,内存池机制 一。对象引用机制 python内部引用...

网友评论

    本文标题:Python 内存中的垃圾回收

    本文链接:https://www.haomeiwen.com/subject/cfyxhctx.html