zoukankan      html  css  js  c++  java
  • python的内存管理机制

    python的内存管理机制:

    1)引用计数

    2)垃圾回收

    3)内存池

    4) 优化机制

    #1.引用计数:--》算法
    
    引用计数是一种非常高效的内存管理手段,当一个pyhton对象被引用时其引用计数增加1,当其不再被引用时引用计数减1,当引用计数等于0的时候,对象就被删除了
    
    #垃圾回收机制:
    
    1.引用计数
    引用计数也是一种垃圾回收机制,而且是一种最直观,最简单的垃圾回收技术。
    在Python中每一个对象的核心就是一个结构体PyObject,它的内部有一个引用计数 ob_refcnt,当python的某个对象引用计数为0。就说明没有任何引用指向该对象,该对象就成为要被回收的垃圾了。
    
    标记清除
    标记清除用来解决循环引用产生的问题,循环引用只有在容器对象才会产生,比如字典,元祖,列表等。首先为了追踪对象,需要每个容器对象维护两个额外的指针,用来将容器对象组成一个链表,指针分别指向前后两个容器对象,这样可以将对象的循环引用摘除,就可以得出两个对象的有效计数。
    
    分代回收
    GC的阈值,所谓阈值就是一个临界点的值。
    随着你的程序运行,Python解释器保持对新创建的对象,以及因为引用计数为零而被释放掉的对象的追踪。从理论上说,创建==释放数量应该是这样子。但是如果存在循环引用的话,肯定是创建>释放数量,当创建数与释放数量的差值达到规定的阈值的时候,当当当当~分代回收机制就登场啦。
    
    分代回收思想将对象分为三代(generation 0,1,2)
    0代表幼年对象,
    1代表青年对象,
    2代表老年对象。
    根据弱代假说(越年轻的对象越容易死掉,老的对象通常会存活更久。)
    新生的对象被放入0代,如果该对象在第0代的一次gc垃圾回收中活了下来,那么它就被放到第1代里面(它就升级了)。如果第1代里面的对象在第1代的一次gc垃圾回收中活了下来,它就被放到第2代里面。
    
    gc每一代垃圾回收所触发的阈值可以自己设置
    
    #内存池
    
    Python的内存机制呈现金字塔形状,-1,-2层主要有操作系统进行操作
    第0层是C中的malloc,free等内存分配和释放函数进行操作
    第1层和第2层是内存池,有python接口函数,PyMem_Malloc函数实现,当对象小于256k的时由该层直接分配内存
    第3层是最上层,也就是我们对python对象的直接操作
    Python在运行期间会大量地执行malloc和free的操作,频繁地在用户态和核心态之间进行切换,这将严重影响Python的执行效率。为了加速Python的执行效 率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。
    
    #调优手段
    
    1.手动垃圾回收
    2.避免循环引用(手动解循环引用和使用弱引用)
    3.调高垃圾回收阈值
    
  • 相关阅读:
    串口通讯编程一日通2(Overlapped IO模型)
    串口通讯编程一日通1(整合资料)
    Overlapped I/O模型深入分析(转)
    JVM7、8详解及优化
    vmstat工具
    spring 每个jar的作用
    Linux查看内存使用情况
    mysql datetime与timestamp精确到毫秒的问题
    eclipse UTF-8
    java.security
  • 原文地址:https://www.cnblogs.com/shaozheng/p/11889904.html
Copyright © 2011-2022 走看看