高频面试题之Python垃圾回收机制

简介: 什么垃圾回收机制? 引用计数 标记清除 分代回收

高频面试题之Python垃圾回收机制

什么垃圾回收机制?

应用程序在运行的过程中会产生大量的变量来存储数据, 在运行过程中某些变量已经失去了作用价值, 就需要将这些毋庸的变量销毁掉来提升所占据的内控空间, 减少消耗!

python, java,php, 一般在底层会自动回收垃圾, 很少数需要手动操作

C语言, 汇编语言, 是需要手动清楚垃圾变量, 比较麻烦

Python垃圾回收机制

在Python中的垃圾回收机制, 是以 引用计数 为主要方式, 配合 标记清除还有 分代回收进行辅助回收的

1.引用计数规则

在Python内部会为每一个对象的维护创建引用计数器

当一个对象的引用被创建或者复制时,对象的引用计数器 +1

当一个对象的引用被销毁时,计数器的值-1

当计数器的值为0时,就意味着对象已经再没有被使用了,可以将其内存释放掉。
laji.jpg

2. 标记清除

标记-清除 规则 主要是为了解决循环引用,它的侧重点就在于关注可能产生循环引用的对象!

    容器变量是最容易发生循环引用的现象的, 容器变量内部互相引用就会出现这种情况
那么 标记清除是 怎么解决这个问题的呢?
​ 为了方便大家理解这个思路呢, 我们就不从root链表和unreachable链表出发了, 直接简单明了, 就是当容器变量对象被创建好的时候出了本身的引用计数之后, 还会把他们对应的内存的变量值做个标记, 如果后期发现 在堆里面找不到与 前面容器变量相对象的数据 则都被人为是 垃圾数据 而被回收机制清理

3. 分代回收

Python为了提高垃圾回收机制的效率提出了分代回收策略

一般表示方法有2类

1.数字表示法:
  • 0代 表示垃圾回收最频繁的对象
  • 1代 其次
  • 2代 表示回收次数最少的对象
2.年纪表示法:
  • 青年代 表示垃圾回收最频繁的对象
  • 中年代 其次
  • 老年代 表示回收次数最少的对象
核心思想就是: 对象在运行期间存活的时间越久越不可能被销毁, 应该减少对它的收集频率!

垃圾回收机制的模块

python采用的主要的垃圾回收机制模块是GC 模块
import sys
import gc


class ObjectDemo:
    def __del__(self):
        print("我被销毁了 ...")


print(gc.get_threshold())  # 打印分代收集的设置
demo = ObjectDemo()  # 创建对象 引用计数器 + 1
print(sys.getrefcount(demo))  # getrefcount() 函数调用  引用计数器 +1

-- (700, 10, 10)  
#     700  当0代链表中超过700个对象时,自动进行分代收集, 默认
#     10   当0代链表回收10次后,对0代和1代进行收集
#     10   当1代链表回收10次以后,对所有链表进行收集

-- 2    #  总共计数器 是 2 
-- 我被销毁了 ...

 
相关文章
|
1月前
|
人工智能 Java 机器人
【python】python的垃圾回收机制(详细讲解)
【python】python的垃圾回收机制(详细讲解)
|
2月前
|
算法 Java Python
请简述Python中的垃圾回收机制。
请简述Python中的垃圾回收机制。
14 0
|
4月前
|
算法 Java Python
|
4月前
|
算法 Java 程序员
|
2天前
|
监控 算法 Java
Python内存管理与垃圾回收机制
【5月更文挑战第12天】了解Python内存管理与垃圾回收对编写高效稳定程序至关重要。Python自动管理内存,使用`malloc()`和`free()`分配和释放。引用计数跟踪对象引用,当引用计数为零时对象销毁。垃圾回收处理循环引用,采用分代回收算法。优化技巧包括避免循环引用、显式释放对象、使用生成器和迭代器。理解这些机制有助于避免内存泄漏,提高性能。通过示例代码,学习如何在实践中应用内存管理最佳实践和高级优化技巧,以及如何调试和诊断内存问题。在并发和异步编程中,需注意线程安全和异步内存管理。掌握这些知识能提升Python编程的效率和质量。
10 3
|
5天前
|
算法 Java C++
python垃圾回收机制详解
python垃圾回收机制详解
11 0
|
24天前
|
数据采集 机器学习/深度学习 数据挖掘
Python数据清洗与预处理面试题解析
【4月更文挑战第17天】本文介绍了Python数据清洗与预处理在面试中的常见问题,包括Pandas基础操作、异常值处理和特征工程。通过示例代码展示了数据读取、筛选、合并、分组统计、离群点检测、缺失值和重复值处理、特征缩放、编码、转换和降维。强调了易错点,如忽视数据质量检查、盲目处理数据、数据隐私保护、过度简化特征关系和忽视模型输入要求。掌握这些技能和策略将有助于在面试中脱颖而出。
33 8
|
25天前
|
JSON 网络协议 API
Python网络编程面试题精讲
【4月更文挑战第15天】本文介绍了Python网络编程的面试重点,包括基础Socket编程、HTTP协议与requests库、异步编程与asyncio库。通过实例解析常见面试题,强调了非阻塞套接字、异常处理、HTTP状态码检查以及异步任务管理等关键点。提供代码示例帮助读者巩固概念,助力面试准备。
17 0
|
26天前
|
调度 Python
Python多线程、多进程与协程面试题解析
【4月更文挑战第14天】Python并发编程涉及多线程、多进程和协程。面试中,对这些概念的理解和应用是评估候选人的重要标准。本文介绍了它们的基础知识、常见问题和应对策略。多线程在同一进程中并发执行,多进程通过进程间通信实现并发,协程则使用`asyncio`进行轻量级线程控制。面试常遇到的问题包括并发并行混淆、GIL影响多线程性能、进程间通信不当和协程异步IO理解不清。要掌握并发模型,需明确其适用场景,理解GIL、进程间通信和协程调度机制。
35 0
|
26天前
|
API Python
Python模块化编程:面试题深度解析
【4月更文挑战第14天】了解Python模块化编程对于构建大型项目至关重要,它涉及代码组织、复用和维护。本文深入探讨了模块、包、导入机制、命名空间和作用域等基础概念,并列举了面试中常见的模块导入混乱、不适当星号导入等问题,强调了避免循环依赖、合理使用`__init__.py`以及理解模块作用域的重要性。掌握这些知识将有助于在面试中自信应对模块化编程的相关挑战。
22 0