python的优化机制与垃圾回收与gc模块

python属于动态语言,我们可以随意的创建和销毁变量,那么如果频繁的创建和销毁则会浪费cpu,那么python内部是如何优化的呢?

python和其他很多高级语言一样,都自带垃圾回收机制,不用我们去维护,也避免了出现内存泄漏,悬空指针等bug,那么python内部如何进行垃圾回收的呢?

python的垃圾回收,我们用gc模块去开启或者关闭它,那么gc模块又是什么呢?

python的优化机制

垃圾回收

关于循环引用进行一个测试

import gc  # python的一个垃圾回收模块,garbage collection

class A(object):
    def __init__(self):
        pass

def foo():
    while True:
        a1 = A()
        a2 = A()
        a1.t = a2
        a2.t = a1
        del a1
        del a2

gc.disable()
foo()

‘‘‘
当我们使用gc.disable(),就意味着我们把python的垃圾回收机制给关闭了,那么一些垃圾便不会被自动回收。
首先我们创建了两个实例对象a1和a2,然后在a1的内部创建一个属性指向a2,在a2的内部创建一个属性指向a1
那么a1和a2的引用计数都为2,即使del a1,del a2,它们的引用计数还是为1,因此仍然会待在内存里不会被回收
当我们进行第二轮循环的时候,会继续再内存中创建一份a1和a2,不断地循环会发现程序所使用的内存也来越大,直至溢出崩溃
‘‘‘

探讨一下ruby和python的垃圾回收机制ruby和python均属于脚本语言,它们是非常相似的,比方说定义两个类
ruby的对象分配当我们执行上面的Node.new(1)时,ruby在内部给我们做了什么?ruby是如何创建新的对象的呢?其实ruby做的很少,实际上早在代码执行之前,ruby就创建了成百上千个对象(类似于python的小整数对象池),并把它们串在链表上,叫做可用链表因此在创建对象的时候直接拿来用就可以了。

白色的小方格相当于标着一个“未使用预创建对象”,当我们调用Node.new方法时,ruby直接取出一个给我们使用即可

可以简单地理解,黑色格子是当前使用的对象,白色格子是未使用对象。当我们创建了一个“ABC”,放在了第一个格子的位置,让n1这个变量指向它。

由于这是一个链表,链表上的对象一般保存着下一个对象的内存指针,因此我们只需要找到一个便可以顺藤摸瓜将剩下的全给找出来,由于已经被使用,那么“箭头”也被切断了,剩下的白色格子在一个链表上,保存的是可用的内存

如果我们再次调用Node.new,ruby将继续递给我们一个对象。

因此随着我们不断地创建,ruby不断的从可用链表里取预创建对象给我们,从而也就导致了可用链表会越来越短

注意图像,我为n1不止赋了一次值,赋完值之后,又给n1赋了新的值,让n1指向了新的内存空间,那么就会有垃圾产生。

ruby的标记--清除

当我们把可用空间全部用完了,可用链表上变得空空如也

可以看到所有格子都变灰了,没有白格子了。那么ruby是如何解决这一问题的呢?

ruby使用的是标记--清除,首先ruby会把程序停下来,然后轮询所有的指针,变量和代码产生的别的引用对象以及其他值,同时ruby通过自身的虚拟机遍历内部指针,只要对象被引用,那么便将其标记(mark)出来。

只要没有被标记的,那么便是垃圾。

ruby将这些没有被标记的垃圾进行回收,并把它们送回到可用链表当中。

由于内部发生的很快,ruby不会将对象到处拷贝,而是通过调整内部的指针,将其指向一个新链表的方式,来将垃圾对象归位到可用链表当中的。

python的对象分配的的
 
 

原文地址:https://www.cnblogs.com/traditional/p/9205300.html

时间: 2024-10-03 21:54:33

python的优化机制与垃圾回收与gc模块的相关文章

(转)Java 内存区域分配和垃圾回收(GC)机制

Java垃圾回收概况 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代 码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢.这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制.概括地说,该机制对 JVM(Java Virtual Machine)中的内存进行标记,并确定哪些内存需要回收,根据一定的回收策略,自动的回收内存,永不停息(Nerver Stop

《python解释器源码剖析》第17章--python的内存管理与垃圾回收

17.0 序 内存管理,对于python这样的动态语言是至关重要的一部分,它在很大程度上决定了python的执行效率,因为在python的运行中会创建和销毁大量的对象,这些都设计内存的管理.同理python还提供了了内存的垃圾回收(GC,garbage collection),将开发者从繁琐的手动维护内存的工作中解放出来.这一章我们就来分析python的GC是如何实现的. 17.1 内存管理架构 在python中内存管理机制是分层次的,我们可以看成有四层,0 1 2 3.在最底层,也就是第0层是

JVM虚拟机-03、JVM内存分配机制与垃圾回收算法

JVM虚拟机-03.JVM内存分配机制与垃圾回收算法 1 JVM内存分配与回收 1.1 对象优先在Eden区分配 大多数情况下,对象在新生代中?Eden?区分配.当?Eden?区没有足够空间进行分配时,虚拟机将发起一次Minor?GC.我们来进行实际测试一下.在测试之前我们先来看看?Minor?GC和Full?GC?有什么不同呢? Minor?GC/Young?GC:指发生新生代的的垃圾收集动作,MinorGC非常频繁,回收速度一般也比较快. Major?GC/Full?GC:一般会回收老年代,

autorelease 和垃圾回收制(gc)的区别

IPhone OS有没有垃圾回收?autorelease 和垃圾回收制(gc)有什么关系? 没有.autorelease只是延迟释放,gc是每隔一段时间询问程序,看是否有无指针指向的对象,若有,就将它回收.他们 两者没有什么关系.

再论C++之垃圾回收(GC)

本文已经迁移到:http://cpp.winxgui.com/cn:garbage-collection-in-cplusplus 使用智能指针(smart pointers) http://www.codeproject.com/cpp/garbage_collect.asp 原理:基于引用计数(reference count). 这样的垃圾回收(gc)算法无非都是给每一块分配的内存提供引用计数,然后通过智能指针(smart pointer)自己主动完毕引用计数的加减,假设引用技术降低到零,就

python的内存管理与垃圾回收机制学习

一.python内存申请: 1.python的内存管理分为六层:最底的两层有OS控制.第三层是调用C的malloc和free等进行内存控制.第四层第五层是python的内存池.最上层使我们接触的直接对python对象进行操作. 2.python申请对象时候小于256Byte的字节申请回直接使用python自己的内存分配系统,当大于256Byte的时候会调用malloc直接分配一个256k的大内存空间.释放内存空间时候会回收到内存池中而不是直接调用free释放掉. 3.深浅拷贝的不同(id?内存地

Python程序运行流程与垃圾回收机制

Python程序运行流程 Python解释器首先将程序将py文件编译成一个字节码对象PyCodeObject(只存在于内存中).(当这个模块的 Python 代码执行完后,就会将编译结果保存到了pyc文件中,这样下次就不用编译,直接加载到内存中.pyc文件只是PyCodeObject对象在硬盘上的表现形式.) py文件被编译后,接下来的工作就交由 Python虚拟机来执行字节码指令.Python虚拟机会从编译得到的PyCodeObject对象中依次读入每一条字节码指令,并在当前的上下文环境中执行

[Python之路] 内存管理&垃圾回收

一.python源码 1.准备源码 下载Python源码:https://www.python.org/ftp/python/3.8.0/Python-3.8.0.tgz 解压得到文件夹: 我们主要关注Include中的".h"文件以及Objects目录中的".c"文件. 我们从Include和Objects中的文件类型就可以看出Python解释器是C语言编写的. 2.object.h 在Include文件夹中,全部都是".h"文件. 这些C语言

谈谈JVM垃圾回收机制及垃圾回收算法

一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理.由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”.垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存. ps:内存泄露是指该内存空间使用完毕之后未回收,在不涉及复杂数据结构的一般情况下,Java 的内存泄露表现为一个内存对象的生命周期超出了程序需要它的时间长度,我们有时也将其