python垃圾回收机制(GC)相关问题

简介: 在使用python中很少遇到内存溢出的问题,也不关心内存的管理问题,这是高级语言自带的处理机制,将内部的垃圾空间清除。要清楚是怎么回收垃圾的,那我们应该先明白什么情况下产生垃圾,就涉及到python内部的对象管理方法。

在使用python中很少遇到内存溢出的问题,也不关心内存的管理问题,这是高级语言自带的处理机制,将内部的垃圾空间清除。


要清楚是怎么回收垃圾的,那我们应该先明白什么情况下产生垃圾,就涉及到python内部的对象管理方法。


对于int类型的变量在[5, 257)范围内是共用对象常驻内存,不在此范围内的话一个变量建立一个对象。

单个字符是常驻内存共用对象,字符串是引用计数机制(相同的值指向同一个对象)

a = 256
a1 = 256
b = 257
b1 = 257
id(a) == id(a1)
Out[6]: True
id(b) == id(b1)
Out[7]: False
c1 = 'a'
c = 'a'
d = 'sdsds4'
d1 = 'sdsds4'
id(c) == id(c1)
Out[12]: True
id(d) == id(d1)
Out[13]: True


首先在对象管理上已经做到了最小化的内存开销,并不是一个变量一个对象,而是多种方案结合。


那再看垃圾回收的机制,与C/C++有别的是python内部实现了自动的垃圾回收,而无需用户考虑什么时候销毁一个对象或变量。python的垃圾回收机制是以引用计数机制为主,标记-清除和分代收集两种机制为辅的综合方案。

引用计数机制

上面说的字符串内存管理就是引用计数,当创建一个字符串a='test',之后再创建一个b = 'test‘,其实变量a/b指向的是一个对象’test',这个对象被引用的次数是2,但是当我们改变b='test1‘,这个时候b新建了一个对象'test1'并且引用计数为1,相应的a引用计数也变为了1,这就是引用计数。


那么怎么通过引用计数回收垃圾对象呢?还是上面那个案例,此时再把变量a赋值a='test2',那么又新建了一个对象'test2'并且引用计数为1,此时之前的'test'引用计数变为0,就意味没有任何变量使用了该对象,那这个对象就是垃圾对象被销毁。


引用计数简单方便但是也有弊端:计数占用内存、在相互引用的对象中计数永远不会变为0,所以还引入了标记-清除和分代收集。


标记-清除

标记清除的概念类似于引用计数,只是不同的是当引用计数为0的时候就给这个对象打上一个标签”可清除“,但是不会立马清除,而是会等到系统给程序分配的内存要用完之时,停下来将可清除标签的对象销毁然后继续。


分代回收


首先看上面说的引用计数的弊端在两个变量循环引用中,计数永远不可能是0.

b = [3,4]
a = [1,2]
a.append(b)
b.append(a)
a
Out[25]: [1, 2, [3, 4, [...]]]
b
Out[26]: [3, 4, [1, 2, [...]]]
del a
b
Out[29]: [3, 4, [1, 2, [...]]]


当删除a/b变量时对应的内存对象应用计数还是1是无法删除的,此时分代回收就发挥了他的作用,当创建一个对象是将它向上面对象一个放在一个抽象的链条上,这条链条就是零代链条。

然后当零代链条上对象数达到阀值就对上面相互引用的对象进行检测,将相互引用的对象的计数减1,再标记清除垃圾,此时剩下的对象移到一代链条,当一代链条到达阀值就重复零代的检测方式,将剩下对象移到二代,就以此类推进行下去。


相关文章
|
2月前
|
算法 网络协议 Java
【JVM】——GC垃圾回收机制(图解通俗易懂)
GC垃圾回收,标识出垃圾(计数机制、可达性分析)内存释放机制(标记清除、复制算法、标记整理、分代回收)
|
2月前
|
缓存 监控 算法
Python内存管理:掌握对象的生命周期与垃圾回收机制####
本文深入探讨了Python中的内存管理机制,特别是对象的生命周期和垃圾回收过程。通过理解引用计数、标记-清除及分代收集等核心概念,帮助开发者优化程序性能,避免内存泄漏。 ####
64 3
|
4月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
176 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
3月前
|
Java 程序员 开发者
Python的gc模块
Python的gc模块
|
5月前
|
监控 算法 Java
深入理解Java中的垃圾回收机制在Java编程中,垃圾回收(Garbage Collection, GC)是一个核心概念,它自动管理内存,帮助开发者避免内存泄漏和溢出问题。本文将探讨Java中的垃圾回收机制,包括其基本原理、不同类型的垃圾收集器以及如何调优垃圾回收性能。通过深入浅出的方式,让读者对Java的垃圾回收有一个全面的认识。
本文详细介绍了Java中的垃圾回收机制,从基本原理到不同类型垃圾收集器的工作原理,再到实际调优策略。通过通俗易懂的语言和条理清晰的解释,帮助读者更好地理解和应用Java的垃圾回收技术,从而编写出更高效、稳定的Java应用程序。
|
4月前
|
存储 Java PHP
【JVM】垃圾回收机制(GC)之引用计数和可达性分析
【JVM】垃圾回收机制(GC)之引用计数和可达性分析
103 0
|
5月前
|
缓存 Java Python
python垃圾回收&缓存机制
python垃圾回收&缓存机制
|
5月前
|
存储 算法 Java
关于python3的一些理解(装饰器、垃圾回收、进程线程协程、全局解释器锁等)
该文章深入探讨了Python3中的多个重要概念,包括装饰器的工作原理、垃圾回收机制、进程与线程的区别及全局解释器锁(GIL)的影响等,并提供了详细的解释与示例代码。
61 0
|
6月前
|
缓存 监控 Java
"Java垃圾回收太耗时?阿里HBase GC优化秘籍大公开,让你的应用性能飙升90%!"
【8月更文挑战第17天】阿里巴巴在HBase实践中成功将Java垃圾回收(GC)时间降低90%。通过选用G1垃圾回收器、精细调整JVM参数(如设置堆大小、目标停顿时间等)、优化代码减少内存分配(如使用对象池和缓存),并利用监控工具分析GC行为,有效缓解了高并发大数据场景下的性能瓶颈,极大提升了系统运行效率。
185 4
|
5月前
|
监控 算法 Java
深入理解Java中的垃圾回收机制(GC)
本文将探讨Java的自动内存管理核心——垃圾回收机制。通过详细解析标记-清除算法、复制算法和标记-整理算法等常用垃圾回收算法,以及CMS、G1等常见垃圾回收器,帮助读者更好地理解Java应用的性能优化和内存管理。同时,探讨分代收集、分区收集等策略在实际项目中的应用。结语部分总结了垃圾回收机制在Java开发中的重要性,并展望了未来可能的发展。
136 2

热门文章

最新文章