电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

python中的垃圾回收(GC)機制

瀏覽:102日期:2022-07-10 16:43:45

一、引用計數

Python 垃圾回收以引用計數為主,分代回收為輔。引用計數法的原理是每個對象維護一個ob_refcnt,用來記錄對象被引用的次數,也就是用來追蹤有多少個引用指向了對象,當發生以下四種情況的時候,對象的引用計數+1:

對象被創建,比如:a = 14 對象被引用,比如: b = a 對象被作為參數,傳給函數,比如:func(a) 對象作為容器中的一個元素,比如:List = {a, ”a” , ”b”, 2}

與上述情況相對應,當發生以下四種情況時,對象的引用計數-1:

對象的別名被顯式銷毀,比如:del a對象的別名被賦予新的對象,比如:a = 26對象離開它的作用域,比如 func() 執行完畢時,函數里面的所有局部變量的引用計數都會減 1將元素從容器中刪除,或者容器被銷毀當對象的引用計數為 0 時,它將被 Python 虛擬機回收。

在 Python 中一切皆對象,它們的核心是 Py_Object 結構體,所有 Python 對象的頭部都包含該結構:

// object.h#define PyObject_HEAD _PyObject_HEAD_EXTRA Py_ssize_t ob_refcnt; struct _typeobject *ob_type;​typedef struct _object { PyObject_HEAD} PyObject;

比如 int 類型的定義如下:

// intobj.htypedef struct { PyObject_HEAD long ob_ival;} PyIntObject;

簡而言之,PyObject 是每個對象必有的內容,其中 ob_refcnt 是對象的引用計數。對象有新的引用時,它的 ob_refcnt 會增加;當對象的引用被刪除時,ob_refcnt 會減少。當引用計數為 0 時,對象的生命周期就結束了。

// object.h#define Py_INCREF(op) ( _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA ((PyObject*)(op))->ob_refcnt++)​#define Py_DECREF(op) do { if (_Py_DEC_REFTOTAL _Py_REF_DEBUG_COMMA --((PyObject*)(op))->ob_refcnt != 0) _Py_CHECK_REFCNT(op) else _Py_Dealloc((PyObject *)(op)); } while (0)

引用計數有很明顯的優點:

高效 運行期沒有停頓,即實時性:對象一旦沒有引用,將直接被釋放。實時性還帶來一個好處是:處理回收內存的時間分攤到了平時 對象有確定的生命周期 易于實現

原始的引用計數法也有明顯的缺點:

維護引用計數消耗資源,維護引用計數的次數和引用賦值成正比 無法解決循環引用的問題

比如:

list1 = []list2 = []list1.append(list2)list2.append(list1)

為了解決這兩個致命弱點,Python 又引入了以下兩種 GC 機制。

二、標記-清除

『標記-清除(Mark-Sweep)』算法是一種基于追蹤回收(tracing GC)技術實現的垃圾回收算法。它分為兩個階段:第一階段是標記階段,GC 會給所有『活動對象』打上標記;第二階段是回收沒有標記的『非活動對象』。那么 GC 如何判斷哪些是活動對象、哪些是非活動對象呢?

對象之間通過引用(指針)連在一起,構成一個有向圖。對象是有向圖的頂點,引用關系是有向圖的弧。從根對象(root object)出發,遍歷有向圖,將可達的(reachable)對象標記為活動對象,不可達的對象就是要被清除的非活動對象。根對象是全局變量、調用棧、寄存器。

python中的垃圾回收(GC)機制

在上圖中,把小黑圈視為全局變量,也就是把它作為 root object,從小黑圈出發,對象 1 可直達,那么它將被標記,對象 2、3 可間接到達,也會被標記,而 4 和 5 不可達,因此 1、2、3 是活動對象,4 和 5 是非活動對象,會被 GC 回收。

標記清除算法作為 Python 的輔助垃圾回收技術,主要用于處理容器對象,比如 list、dict、tuple、instance 等,因為字符串、數值等原子類型的對象不可能造成循環引用問題。Python 使用雙向鏈表將容器對象組織起來。不過這種簡單粗暴的標記清除算法也有明顯的缺點:清除非活動對象前,必須順序掃描整個堆內存,哪怕只剩下小部分非活動對象,也要掃描所有對象。

三,分代回收

分代回收是一種以空間換時間的操作方式,Python 將內存根據對象的存活時間劃分為不同的集合,每個集合稱為一個代,Python 將內存分為了 3 代,分別為年輕代(第 0 代)、中年代(第 1 代)、老年代(第 2 代),它們對應是 3 個鏈表,垃圾回收頻率隨著對象存活時間的增大而減小。新創建的對象都會被分配到年輕代,當年輕代鏈表的節點總數達到上限時,Python 垃圾收集機制就會被觸發,把可以被回收的對象回收掉,而不能被回收的對象會被移到中年代去,依此類推,老年代中的對象是存活時間最久的對象,甚至存活于整個系統的生命周期內。分代回收建立在標記清除的基礎之上,分代回收同樣作為 Python 處理容器對象的輔助垃圾回收技術。

以上就是python中的GC機制的詳細內容,更多關于python GC的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 海峰资讯 - 专注装饰公司营销型网站建设和网络营销培训 | 我车网|我关心的汽车资讯_汽车图片_汽车生活!| 硬度计,金相磨抛机_厂家-莱州华煜众信试验仪器有限公司 | 重庆监控_电子围栏设备安装公司_门禁停车场管理系统-劲浪科技公司 | 嘉兴泰东园林景观工程有限公司_花箱护栏 | 橡胶接头_橡胶软接头_套管伸缩器_管道伸缩器厂家-巩义市远大供水材料有限公司 | 自动记录数据电子台秤,记忆储存重量电子桌称,设定时间记录电子秤-昆山巨天 | 新材料分散-高速均质搅拌机-超声波分散混合-上海化烁智能设备有限公司 | 武汉印刷厂-不干胶标签印刷厂-武汉不干胶印刷-武汉标签印刷厂-武汉标签制作 - 善进特种标签印刷厂 | 广域铭岛Geega(际嘉)工业互联网平台-以数字科技引领行业跃迁 | 课件导航网_ppt课件_课件模板_课件下载_最新课件资源分享发布平台 | 电子巡更系统-巡检管理系统-智能巡检【金万码】| 招商帮-一站式网络营销服务|互联网整合营销|网络推广代运营|信息流推广|招商帮企业招商好帮手|搜索营销推广|短视视频营销推广 | 岸电电源-60HZ变频电源-大功率变频电源-济南诚雅电子科技有限公司 | 济南画室培训-美术高考培训-山东艺霖艺术培训画室 | EDLC超级法拉电容器_LIC锂离子超级电容_超级电容模组_软包单体电容电池_轴向薄膜电力电容器_深圳佳名兴电容有限公司_JMX专注中高端品牌电容生产厂家 | 带压开孔_带压堵漏_带压封堵-菏泽金升管道工程有限公司 | 医疗仪器模块 健康一体机 多参数监护仪 智慧医疗仪器方案定制 血氧监护 心电监护 -朗锐慧康 | uv固化机-丝印uv机-工业烤箱-五金蚀刻机-分拣输送机 - 保定市丰辉机械设备制造有限公司 | 定硫仪,量热仪,工业分析仪,马弗炉,煤炭化验设备厂家,煤质化验仪器,焦炭化验设备鹤壁大德煤质工业分析仪,氟氯测定仪 | 南京欧陆电气股份有限公司-风力发电机官网| ★塑料拖链__工程拖链__电缆拖链__钢制拖链 - 【上海闵彬】 | 防爆正压柜厂家_防爆配电箱_防爆控制箱_防爆空调_-盛通防爆 | 奇酷教育-Python培训|UI培训|WEB大前端培训|Unity3D培训|HTML5培训|人工智能培训|JAVA开发的教育品牌 | 钢木实验台-全钢实验台-化验室通风柜-实验室装修厂家-杭州博扬实验设备 | 排烟防火阀-消防排烟风机-正压送风口-厂家-价格-哪家好-德州鑫港旺通风设备有限公司 | 济南保安公司加盟挂靠-亮剑国际安保服务集团总部-山东保安公司|济南保安培训学校 | 全温恒温摇床-水浴气浴恒温摇床-光照恒温培养摇床-常州金坛精达仪器制造有限公司 | 包头市鑫枫装饰有限公司| 酒万铺-酒水招商-酒水代理| 高压互感器,电流互感器,电压互感器-上海鄂互电气科技有限公司 | 水轮机密封网 | 水轮机密封产品研发生产厂家 | 网站建设-临朐爱采购-抖音运营-山东兆通网络科技 | X光检测仪_食品金属异物检测机_X射线检测设备_微现检测 | 大学食堂装修设计_公司餐厅效果图_工厂食堂改造_迈普装饰 | 天津蒸汽/热水锅炉-电锅炉安装维修直销厂家-天津鑫淼暖通设备有限公司 | 液压扳手-高品质液压扳手供应商 - 液压扳手, 液压扳手供应商, 德国进口液压拉马 | 高楼航空障碍灯厂家哪家好_航空障碍灯厂家_广州北斗星障碍灯有限公司 | CTAB,表面活性剂1631溴型(十六烷基三甲基溴化铵)-上海升纬化工原料有限公司 | 吉林污水处理公司,长春工业污水处理设备,净水设备-长春易洁环保科技有限公司 | 北京网站建设-企业网站建设-建站公司-做网站-北京良言多米网络公司 |