码迷,mamicode.com
首页 > 其他好文 > 详细

内存管理机制/垃圾回收机制:

时间:2019-12-08 12:47:14      阅读:78      评论:0      收藏:0      [点我收藏+]

标签:struct   回收机制   引用计数器   计数器   with   comm   创建   asd   ext   

内存管理机制(垃圾回收机制)

  • 对象分类:

    • 定长: int / float

       #define _PyObject_HEAD_EXTRA            \
           struct _object *_ob_next;           \
           struct _object *_ob_prev;
       ?
       typedef struct _object {
           _PyObject_HEAD_EXTRA  // 用于构造双向链表
           Py_ssize_t ob_refcnt; // 引用计数器
           struct _typeobject *ob_type; // 类型
       } PyObject;
    • 多个元素组成: str/list/dict/set/tuple

       typedef struct {
           PyObject ob_base;
           Py_ssize_t ob_size; /* Number of items in variable part */
       } PyVarObject;
  • 内存管理机制

    • 引用计数器为主

       def func():
       ?
          每次创建对象,会在内存中开辟空间,引用计数器默认为1;
          a = 123
       ?
          在创建一个变量指向原来a开辟的内存,引用计数 +1;
          b = a
       ?
       func()
       ?
       当引用计数器为0,则表示它时垃圾,可以进行回收.
    • 循环引用的问题

       当Python中对于 str/list/dict/set/tuple 类创建对象时,会将对象放到一个双向链表中. 
       a = "asdf"
       b = [11,22]
       c = {‘k1‘:123}
       ?
       如果链表中达到700个对象,会对双向链表中的所有元素进行扫描. 如果有循环引用,则两个都-1,最后扫描完毕,将链表中的所有元素一分为二:
        1. 引用计数器为0的对象, 回收.
        2. 引用计数器不为0的对象,就将它放到另外一个双向链表中(总共有3个链表).  

内存管理机制/垃圾回收机制:

标签:struct   回收机制   引用计数器   计数器   with   comm   创建   asd   ext   

原文地址:https://www.cnblogs.com/zhang-da/p/12005111.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!