python 基础之垃圾回收机制

news/2024/11/8 16:46:41/

一、背景

之前能说个大概,python垃圾回收机制,设计到细节就不太清楚。
如同刚毕业的少年,出厂自带三年工作经验。做过啥啥.. 一问细节,阿西吧.. 
不要问我怎么知道滴.. 哈哈!!!- 提高自己的计算机基础
- 重要的是面试(曾被问到三次)
- 装逼用

二、垃圾回收分类

1. 引用计数
2. 标记清楚
3. 分代回收

三、python垃圾回收机制

1. 引用计数
  • 引用计数: 一个对象会记录自身被引用的个数

    每增加一个引用,这个对象的引用计数会自动+1
    每减少一个引用,这个对象的引用计数会自动-1当一个对象 如果被引用+1  删除一个引用 -1   0被自动释放
    
  • 引用计数增加场景+1

    1. 第一次创建对象时 p1 = Persion()
    2. 对象被再次饮用时 p2 = p1
    3. 对象被当作参数,传入到一个函数当中
    4. 对象作为一个元素,存在容器中  li = [ p1 ]
    
  • 引用计数-1场景

    1. 对象的别名被显式销毁   del p1
    2. 对象的别名被赋予新的对象  p1 = 123
    3. 一个对象离开了他的作用域 一个函数执行完毕时例: 在函数内部定义一个局部变量, 当这个函数执行完毕时, 它内部引用的函数对象会再次被释放
    4. 对象所在的容器被销毁, 或从容器中删除   例:1 的第四种
    
  • 引用计数查看

    import sys
    sys.getrefcount(obj) - 1
    
2. 标记清楚
  • 标记清除:从经历过引用计数机制仍未释放的对象中,找到循环引用干掉相关对象
  • 标记清除底层机制
    1. 收集所有的容器对象, 通过一个双向链表进行引用 (容器对象:列表、元祖、字典 )
    2. 针对于每一个容器对象,通过一个变量gc_refs 来记录当前对应的引用计数
    3. 找到每个容器对象,找到它引用的容器对象,并将这个容器的引用计数-1
    4. 经过步骤3之后, 如果一个容器对象的引用计数为0, 就代表该对象可以被回收了, 循环引用导致其活到现在的
    
3. 分代回收(参考java机制)
  • 分代回收机制

    1. 默认一个对象被创建出来后, 属于年轻代
    2. 如果经历过年轻代垃圾回收后依然存活,则分配到老年代
    3. 垃圾回收的周期顺序为 年轻代垃圾回收一定次数,会出发年轻代与老年代回收年轻代垃圾回收一定次数, 会出发 年轻代、老年代、持久代回收4. 垃圾回收器中, 新增的对象个数-消亡的对象个数达到一定阈值,才会触发垃圾检测
    
  • 查看分代回收 查看相关参数

    import gc
    print(gc.get_threshold())
    gc.set_threshold(700, 10, 5)
    
    参数1 阈值
    参数2  当年轻代被检测10时 触发年轻代和老年代检测
    参数3  当老年代被检测5时 触发年轻代和老年代检测和老年代的检测
    
  • 垃圾回收时机:

    1. 自动回收
      达到垃圾回收的阈值: 垃圾回收器中, 新增的对象个数和释放对象个数之差达到某个阈值gc.enable()       开启垃圾回收机制(默认开启)
      gc.disable()      关闭来及回收机制
      gc.isenable()     判断是否开启垃圾回收机制
      
    2. 手动回收
      gc.get_threshold()  获取自动回收阀值  
      gc.set_threshold()  设置自动回收阀值
      

四、 java 垃圾回收机制

  • 年轻代(Young Generation)
    所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。
  • 年老代(Old Generation)
    在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。
  • 持久代(Permanent Generation)
    用于存放静态文件,如Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate 等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类

注:b站功夫好呀,b站功夫棒.. 我在b站学的


http://www.ppmy.cn/news/2055.html

相关文章

m基于遗传优化的不同等级电动汽车充电站的选址方案matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 作为电动汽车的普及与推广,必要的基础配套服务设施、充电站的建设位置和选址规划对整体行业的发展起着重要的意义,本文中提出了一个不同等级电动汽车充电站的选址与求解算…

博士论文答辩流程

2023年夏季毕业 (一)、总体时间安排 3月10日至3月20日:博士学位论文答辩资格预审 3月20日至3月25日:提交博士学位论文截止时间,评审时限为30天(学院学籍的截止时间为3月20日) 4月5日&#xf…

私人定制AI绘画——快速finetune stable diffusion教程

最近AI绘图非常火,只需要输入文本就能得到令人惊艳的图。 举个例子,输入 “very complex hyper-maximalist overdetailed cinematic tribal darkfantasy closeup portrait of a malignant beautiful young dragon queen goddess megan fox with long bl…

CSS盒子模型

网页布局过程: 1:准备好相关的网页元素,也就是大大小小的盒子2:利用CSS设置好盒子样式,将对不同的盒子摆放到对应的位置3:将内容填充到对应的盒子中盒子模型: 将html页面中的布局元素看作是一…

面向碳中和的公共建筑室内环境营造再认识

3月26日|清华大学建筑节能学术周——公共建筑节能—工程实践助力实现双碳目标 【3月26日公开论坛】公共建筑节能 – 工程实践助力实现双碳目标 面向碳中和的公共建筑室内环境营造再认识 对“舒适”、“健康”和室内环境营造手段的再认识 1.对“舒适”的再认识 P…

Linux——Xshell、Xftp实现Linux远程登录与应用

目录 一、远程登录 1.1 SSH登录方式 二、Xshell远程连接 2.1 远程连接 2.2 设置粘贴复制 三、Xftp远程连接 3.1 远程连接 3.2 解决乱码 3.3 传输文件 一、远程登录 通常在工作过程中,公司中使用的真实服务器或者是云服务器,都不允许除运维人员 之…

行情不好,要不考个研?

阅读本文大概需要 1.86 分钟。最近看到一个消息,说是 2023 年全国硕士研究生招生考试将于 本月 24 日至 26 日举行,多地也陆续公布 2023 年考研的报考人数。从公布的报名数据来看,考研热度仍然不减。比如陕西省 2023 年考研报名人数为 17 万 …

电子电气架构设计需要考虑哪些方面?

当前车辆日益复杂,车联网功能在各个细分领域都在不断增加,而更强大的智能功能也逐步增加。 所有这些高级功能都依赖于线束和控制器才能发挥作用。然而面对日益增加的车辆复杂性和产品开发周期缩短的压力,导致汽车制造商和系统集成商的成本和…