zoukankan      html  css  js  c++  java
  • 内存管理机制/垃圾回收机制:

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

    • 对象分类:

      • 定长: 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个链表).  
  • 相关阅读:
    练习二(米奇老鼠)
    Photoshop笔记一
    HTML笔记1
    用IDEA写出第一个java web
    TCP协议怎么关闭?
    Sql Server2008R2与IDEA的连接
    通过HttpServer向Prometheus暴露端点
    了解Prometheus到底是什么?
    SPI扩展机制在框架中的使用
    motan系列1——与spring的集成原理
  • 原文地址:https://www.cnblogs.com/zhang-da/p/12005111.html
Copyright © 2011-2022 走看看