Python 垃圾回收机制原理详解

Python 垃圾回收机制原理详解目录 1 引用计数 2 标记 清除 3 分代回收 4 其他 4 1JNI JavaNativeIn 总结 Python 的 GC 模块主要运用了引用计数来跟踪和回收垃圾 通过 标记 清除 解决容器对象可能产生的循环引用问题 通过分代回收以空间换时间进一步提高垃圾回收的效率 也即采用 引用计数 为主 实时性 一旦没有引用 内存就直接释放了 标记 清除 与 分代收集 两种机制为辅的策略 1 引用计数为每一个对象维护一个引用计数器

目录

  • 1. 引用计数
  • 2. 标记-清除
  • 3. 分代回收
  • 4. 其他
    • 4.1 JNI(Java Native Interface)
  • 总结

Python 的GC模块主要运用了引用计数来跟踪和回收垃圾;通过“标记-清除”解决容器对象可能产生的循环引用问题;通过分代回收以空间换时间进一步提高垃圾回收的效率。

也即采用“引用计数“为主(实时性,一旦没有引用,内存就直接释放了),“标记-清除”与“分代收集”两种机制为辅的策略。        

1. 引用计数

为每一个对象维护一个引用计数器,当一个对象的引用被创建或者复制时,(对象的引用)计数器+1,当一个对象的引用被销毁时,计数器的值-1,当计数器的值为0时,就意味着对象已经再没有被使用了,可以将其内存释放掉。

2. 标记-清除

“标记-清除”的出现打破了循环引用,也就是它只关注那些可能会产生循环引用的对象,Python中的循环引用总是发生在容器container对象之间,也就是能够在内部持有其他对象的对象(比如:list、dict、class等)。这也使得该方法带来的开销只依赖于容器对象的数量。

原理:

将集合中对象的引用计数复制一份副本,用于找寻root object集合(该set中的对象是不能被回收的)。当成功找到root object集合,首先将现在的内存链表一分为二,一条链表维护root object集合,成为root链表;另外一条维护剩下的对象,成为unreachable链表。

一旦在标记的过程中,发现现在在unreachable链表且可能存在被root链表中直接或间接引用的对象,就将其从unreachable链表中移到root链表中;当完成标记后,unreachable链表中剩下的所有对象就是垃圾对象了,接下来的垃圾回收只需限制在unreachable链表中即可。

缺点:

该机制所带来的额外操作和需要回收的内存块成正比。

3. 分代回收

活的越长的对象,就越不可能是垃圾,就应该减少对它的垃圾收集频率。

4. 其他

4.1 JNI(Java Native Interface)

提供了若干的API,实现Java与其他语言的通信。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233324.html原文链接:https://javaforall.net

(0)
上一篇 2025年7月29日 下午1:01
下一篇 2025年7月29日 下午1:22


相关推荐

  • Win32 API 访问路由的加密网页

    Win32 API 访问路由的加密网页

    2021年8月6日
    65
  • JS – 基本语法

    JS – 基本语法JavaScript 是一种脚本语言 主要功能是 动态修改 html 页面内容 包括创建 删除 html 页面元素 修改 html 页面元素的内容 外观 位置 大小等 数据类型和变量任何语言都离不开数据类型和变量 虽然 JavaScript 语言是弱类型的语言 但它一样支持变量声明 变量一样存在作用范围 即有局部变量和全局变量之分 定义变量的方式因为 JavaScript 是弱类型的脚本语言 所以使用变量之前 可以无须

    2026年3月26日
    1
  • Redisson 实现分布式锁

    Redisson 实现分布式锁

    2021年7月11日
    87
  • wing是什么_124个叶结点的完全二叉树

    wing是什么_124个叶结点的完全二叉树设一个 n 个节点的二叉树 tree 的中序遍历为(1,2,3,…,n),其中数字 1,2,3,…,n 为节点编号。每个节点都有一个分数(均为正整数),记第 i 个节点的分数为 di,tree 及它的每个子树都有一个加分,任一棵子树 subtree(也包含 tree 本身)的加分计算方法如下:subtree的左子树的加分 × subtree的右子树的加分 + subtree的根的分数若某个子树为空,规定其加分为 1。叶子的加分就是叶节点本身的分数,不考虑它的空子树。试求一棵符合中序遍历为(1,2,

    2022年8月9日
    6
  • siamFC_silvahound

    siamFC_silvahound一SiamFC++网络结构及处理流程如下:注意大多数算法对于分类损失都采用交叉熵损失,而SiamFC++在分类分支中计算cls_score与center-nessscore采用了不同的损失函数,cls_score采用focalloss,这样做是为了缓解正负样本不均衡问题;center-nessscore则采用交叉熵loss。最终用这两部分对应元素相乘得到的结果得到更加合理的分类结果,center_ness的作用就是对每一个正样本位置施加权重,离中心进的权重高,离中心远的权重低使得分类更加合

    2026年4月14日
    6
  • SPSS 性别卡方分析[通俗易懂]

    SPSS 性别卡方分析[通俗易懂]1.新建数据集2.打开变量视图,分别输出group、sex和number其中标签是对数据的说明,值是spss中的显示,比如定义1=subject,则输入1就等价于subject变量视图:数据视图:3.数据分析:点击数据–个案加权–将人数加入个案加权系数否则结果一般有误4.卡方检验分析–描述统计–交叉表–统计–卡方检验确定结果输出:…

    2022年5月16日
    100

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号