Python 那些永远用不到的对象,我们称之为「垃圾」

我们知道使用 Python 可以创建对象,当我们去引用它的时候,系统会开辟一个内存空间存放对象,不过可能有些对象我们用完之后,永远再也不会去使用了,那这对象不能一直留在内存里边吧,对象已经废了,也就成为了「垃圾」,垃圾要清理掉,内存才能腾出位置给别的程序使用。

那么:

Python是怎么回收垃圾的?

先来了解一下「引用次数」,在 Python 的内置模块 sys 有一个 getrefcount 方法,通过它我们可以得到对象被引用的次数:

比如我们定义这样一个「s」:

这里得到的结果为 2 次引用,其中一次是 s,一次是 getrefcount。

接下来我们看看这样的代码:

当我们执行完 fxxk 方法之后,在它下面的 print 调用会报错,也就是说我们无法再去引用对象 s 了,因为它已经被回收。

当执行完 fxxk() 之后,对象 s 的引用数量为 0,而在 Python 的垃圾回收算法中,一个主要的点就是,当对象的引用数量为 0,说明这个对象已经成为「垃圾」了,Python 会将这个对象回收掉,从而释放资源。

通过统计引用次数来释放资源,是相对高效可行的,不过也有存在这样的现象:对象之间相互循环引用,会导致引用数量为一直不为 0,那么这样的垃圾是回收不了的,这就可能会造成内存泄漏。

所以在 Python 新版本中,补充了垃圾回收机制算法——标记清除法和分代收集。

所谓标记清除,就是遍历所有对象,通过链表逐个对象追踪标记到的这些对象是可达的,那么剩下那些对象就是不可达的,说明它们是垃圾,回收掉,这样就可以避免对象循环引用而没办法回收的问题了。

因为每次标记清除的时候,肯定是占用系统资源的,这时候就有人想到,是不是可以分代收集,也就是说,分成三代,把第一次遍历的对象视为第 0 代,那么第一次遍历完活下来的对象,就把它们放入第二代,第二代就不会被那么「严格」的去扫描,如果第二次遍历,第二代的对象又存活,那么就放入第三代,在第三代里面的对象就更「安全」了。

因为对象活得越久,说明它越不是「垃圾」。

以上,我们说的 Python 垃圾回收机制,都是自动的,不用我们亲自来清理垃圾。

那如果我们想自己手动来回收垃圾,可不可以实现呢?

答案是肯定的。

Python手动回收垃圾

我们可以通过 del 命令来删除对象的引用,然后使用 Python 的 gc 模块,调用 collect 方法就可以实现。

现在来写个例子给你参考一下:

代码很简单,这里我们创建了 handsomeb 对象,见一个女生爱一个。。。

主要的是最后两行代码,当我们使用 del handsomeb 的时候,实际上就是将 handsomb 这个对象给删除释放掉,不过这个时候还存在那些和 handsomeb 的关联对象 Girl 们,她们已经没有什么用了,我们可以使用 gc.collect(),将和 handsomeb 关联的对象们都给释放掉,这样就实现了手动回收垃圾。

你还可以到这里了解更多相关内容:

https://docs.python.org/zh-cn/3.8/library/gc.html

ok,以上就是小帅b今天给你带来的分享,关于 Python 的垃圾回收问题,面试也常常会被问到,希望对你有帮助。

ps:本文为小帅b的VIP私密文章,更多了解可以进去:跟小帅b一起通往「Python高手之路」

(0)

相关推荐

  • 程序员登高之路——JAVA篇——2.JVM的垃圾回收

    如何判断对象死亡? 目前主流的判断对象死亡的方法有两种: 1.引用计数法: 每个对象对象包含一个引用计数器,每当对象被引用,引用计数器便加一,引用失效就减一.当对象的引用计数器为0时,则表示对象可被回 ...

  • 说说Python中的垃圾回收机制?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  • 第 111 天:Python 垃圾回收机制

    众所周知,Python 是一门面向对象语言,在 Python 的世界一切皆对象.所以一切变量的本质都是对象的一个指针而已. Python 运行过程中会不停的创建各种变量,而这些变量是需要存储在内存中的 ...

  • 深度揭秘垃圾回收底层,这次让你彻底弄懂她

    Java 与 C++ 之间有一堵由内存动态分配和垃圾收集技术所围成的高墙 ---<深入理解Java虚拟机> 我们知道手动管理内存意味着自由.精细化地掌控,但是却极度依赖于开发人员的水平和细 ...

  • JVM系列十六(三色标记法与读写屏障).

    JVM系列十六(三色标记法与读写屏障).

  • 【Python 第75课】可迭代对象和迭代器

    for 循环是我们在 Python 里非常常用的一个语法,但你有没有思考过 for 循环是怎样实现的? 如果你以前接触过 C++,应该会知道类似 for (int i = 0; i < 100; ...

  • 包办婚姻根治在你心中的“病”不移除  你永远没有高质量的对象

    我们都说古代歌颂爱情,那只是存在于小说里才有爱情,现代爱情这个词的起源我问下各位,知道吗?先卖个关子. 我国建国之前,中国一直都是男权社会,男尊女卑.女性必须养在深闺,然后等待媒婆踏上门槛来说媒,在古 ...

  • 世界第三军事大国,为何给人一种弱小的感觉,永远是被嘲笑的对象

    印度军队,或者称为印度武装部队,根据国际评估为世界第三大武装力量(当然,外国人忘了还有中国),常规部队的总兵力高达135万余人,甚至超过了俄罗斯.且印度是世界上八个拥有核武器的国家之一.印度近年来虽然 ...

  • 「数据分析」 使用Python简单玩玩RFM用户价值模型

    大家好,我是Python小叮当. 最近有朋友在问怎么做用户分群,刚好看到有个RFM客户价值模型,就移过来用python简单演示一下,感觉还是有一定的作用的. > RFM模型是衡量客户价值和客户创 ...

  • 中医望诊帮你找对象,看脸识「渣」不被骗

    特别「想要」,怎么办? 主持人:徐老师,我们又回到刚才那个话题,精满不思淫,可能只有那些修行人能做到,我们普通人很难做到的吧? 徐大夫:我跟你讲个故事,以前我碰到一个肝癌的病人,他就有一段时间特别「想 ...

  • 大米饭在日本过的有多「辛苦」,你可能永远想象不到

    ◎作者 | 狂丸 ◎来源 | 狂丸科学(kuangwanplay)已获授权 瞳孔震动是什么感觉?大概就是当我看到这一张图时的感受吧-- 就在上个月,日本农林水产省的官号在推特发布了一条食谱推荐.黑漆漆 ...

  • 「收藏」2020年Python量化文章合辑

    引言 不知不觉,公众号"Python金融量化"已走过两个年头.这一路走来非常感谢读者的支持,尤其是知识星球圈友,你们的知识付费是我坚持走原创输出的动力.学习是一个循序渐进的过程,只 ...

  • 「原创」海丰阿东:不摔倒,就永远不能学会走路

    「原创」海丰阿东:不摔倒,就永远不能学会走路 一个小孩子从呱呱降生到成长为人这当中所经历的点点滴滴,父母们肯定都看在眼里,记在心上,这世上哪一个小孩子都是从不断的摔倒中学会了走路的,哪一个小孩子能够生 ...

  • Python做一个属于自己的web网站「下」

    原创 AI悦创 AI悦创 1周前 你好,我是悦创.昨天写了一篇:Python 做一个属于自己的web网站「上」,但有点小 bug ,什么 bug 呢?待会就说.开头这张图确实有点丑,不过奈何没办法,没 ...