zoukankan      html  css  js  c++  java
  • 20191031:Python底层机制

    20191031:Python底层机制

    python底层从3个方面来说,分别是:

    1. 引用计数机制
    2. 垃圾回收机制
    3. 内存池机制

    引用计数机制

    使用引用计数来追踪内存中的对象,所有对象都有引用计数,并且这个引用计数一般比我们想象的次数多,对于不可变数据(如数字和字符串),解释器会在程序的不同部分共享内存,以便节约内存,可以通过sys.getrefcount( )来查看对象应用次数。如下:

    >>> a =19880924

    >>> sys.getrefcount(19880924)

    3

    >>> b =19880924

    >>> sys.getrefcount(19880924)

    3

    >>> c = 19880924

    >>> sys.getrefcount(19880924)

    可以看到19880924的引用次数没有随着对象的声明而增加。

    >>> c = 19880924

    >>> sys.getrefcount(19880924)

    3

    >>> sys.getrefcount(c)

    2

    >>> d = c

    >>> sys.getrefcount(c)

    3

    >>> e = c

    >>> sys.getrefcount(c)

    4

    但是如果是对象的引用,则对象的引用次数增加

    内存存储机制类似如下:

     

    引用计数增加的情况:

    1,一个对象分配一个新名称

    2,将其放入一个容器中(如列表、元组或字典)

    引用计数减少的情况:

    1,使用del语句对对象别名显示的销毁

    2,引用超出作用域或被重新赋值

    垃圾回收机制

    1. 当一个对象的引用计数为0的时候就被垃圾回收给回收掉了
    2. 解释器会定期执行一个循环检测器,搜索不可访问对象的循环并删除它们。

    a)     假如2个对象相互引用,由于每个对象都包含一个对其他对象的应用,因此引用计数不会归零,对象也不会销毁。针对这种情况适用于2

    内存池机制

    Pymalloc机制:引入内存池机制,是用于管理小块内存的申请和释放的,Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的malloc。对于Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。

    python回收的内存放到内存池而不是返回给操作系统。

  • 相关阅读:
    文件的类型
    读取文件,并按原格式输出文件内容的三种方式
    react hook代码框架
    器具的行为模式
    设计模式
    cpu 内存 机器语言 汇编 高级语言 平台之间的关系
    操作系统之内存
    操作系统之文件
    操作系统之IO
    七层模型之应用层
  • 原文地址:https://www.cnblogs.com/hyj691001/p/11773302.html
Copyright © 2011-2022 走看看