Python開發運維:Python垃圾回收機制

目錄

一、理論

1.Python垃圾回收機制




一、理論

1.Python垃圾回收機制

(1)引?計數器

1)環狀雙向鏈表 refchain
在python程序中創建的任何對象都會放在refchain鏈表中。

name = "david"
age = 20
hobby = ["籃球",'游泳']
內部會創建?些數據【 上?個對象、下?個對象、類型、引?個數 】
name = "david"
new = name內部會創建?些數據【 上?個對象、下?個對象、類型、引?個數、val=18】
age = 20內部會創建?些數據【 上?個對象、下?個對象、類型、引?個數、items=元素、元素個數 】
hobby = ["籃球",'游泳']


在C源碼中如何體現每個對象中都有的相同的值:PyObject結構體(4個值)。
有多個元素組成的對象:PyObject結構體(4個值) + ob_size 。

2)類型封裝結構體

data = 3.14內部會創建:_ob_next = refchain中的上?個對象_ob_prev = refchain中的下?個對象ob_refcnt = 1ob_type = floatob_fval = 3.14

3)引?計數器

v1 = 3.14
v2 = 999
v3 = (1,2,3)

當python程序運?時,會根據數據類型的不同找到其對應的結構體,根據結構體中的字段來進?創建相 關的數據,然后將對象添加到refchain雙線鏈表中。 在C源碼中有兩個關鍵的結構體:PyObject、PyVarObject。 每個對象中有 ob_refcnt就是引?計數器,值默認為 1 ,當有其他變量引?對象時,引?計數器就會發 ?變化。

#引?
a = 777
b = a#刪除引?
a = 777
b = a
del b # b變量刪除;b對應對象引?計數器-1
del a # a變量刪除;a對應對象引?計數器-1
# 當?個對象的引?計數器為0時,意味著沒有?再使?這個對象了,這個對象就是垃圾,垃圾回收。
# 回收:1.對象從refchain鏈表移除;2.將對象銷毀,內存歸還。

4)循環引?問題

v1 = [11,22,33]  #refchain中創建一個列表對象,由于v1=對象,所以列表引用對象計數器為1
v2 = [44,55,66]  #refchain中創建一個列表對象,由于v2=對象,所以列表引用對象計數器為1
v1.append(v2)    #把v2追加到v1中,則v2對應的[44,55,66]對象的引用計數器增加1,最終為2
v2.append(v1)    #把v1追加到v2中,則v1對應的[11,22,33]對象的引用計數器增加1,最終為2del v1           #引用計數器-1
del v2           #引用計數器-1

(2)標記清除

?的:為了解決引?計數器循環引?的不?。
實現:在python的底層再維護?個鏈表,鏈表中專?放那些可能存在循環引?的對象
(list/tuple/dict/set)。

在Python內部 某種情況 下觸發,回去掃描 可能存在循環應?的鏈表 中的每個元素,檢查是否有循環引?,如果有則讓雙?的引?計數器 -1 ;如果是0則垃圾回收。

(3)分代回收

將可能存在循環應?的對象維護成3個鏈表:
0代:0代中對象個數達到700個掃描?次。
1代:0代掃描10次,則1代掃描?次。
2代:1代掃描10次,則2代掃描?次。

(4) 總結

在python中維護了?個refchain的雙向環狀鏈表,這個鏈表中存儲程序創建的所有對象,每種類型的對
象中都有?個ob_refcnt引?計數器的值,引?個數 + 1、-1 ,最后當引?計數器變為0時會進?垃圾回
收(對象銷毀、refchain中移除)。但是,在python中對于那些可以有多個元素組成的對象可能會存在循環引?的問題,為了解決這個問題
python?引?了標記清除和分代回收,在其內部為了4個鏈表,
refchain
2代,10?
1代,10次
0代,700個在源碼內部當達到各?的閾值時,就會觸發掃描鏈表進?標記清除的動作(有循環則各?-1)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/211384.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/211384.shtml
英文地址,請注明出處:http://en.pswp.cn/news/211384.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

放蘋果 .

把m個同樣的蘋果放在n個同樣的盤子里,允許有的盤子空著不放,問共有多少種不同的分法? 注意:如果有7個蘋果和3個盤子,(5,1,1)和(1,5,1&…

spring集成mybatis簡單教程

首先說下實現了什么效果,就是不用每次查詢前手動創建 sessionFactory和添加datasource文件了。 整個工程結構是這樣的 這次我也把代碼放在了gitee上,方便大家更全貌的看到所有的實現細節。代碼鏈接如下: Java: 一些Java代碼 (gitee.com) …

大話數據結構-查找-多路查找樹

注:本文同步發布于稀土掘金。 7 多路查找樹 多路查找樹(multi-way search tree),其每個結點的孩子可以多于兩個,且每一個結點處可以存儲多個元素。由于它是查找樹,所有元素之間存在某種特定的排序關系。 …

排序:歸并排序

目錄 歸并排序——有遞歸的: 基本思想: 思路分析: 代碼分析: 劃分區間思路: 代碼思路分析: 歸并排序——有遞歸的: 基本思想: 歸并排序(MERGE-SORT&#xff…

2023 CCF中國軟件大會(CCF ChinaSoft)“軟件工程教育”論壇 成功召開

2023年12月1日,2023年度CCF中國軟件大會“軟件工程教育”論壇成功召開。 ? 自去年來大模型技術的出現以及在各個領域的應用,對相關的學科和行業產生了深刻的影響。軟件工程首當其沖,以ChatGpt和CopilotX等為代表的智能化開發工具可以幫助軟…

2024年網絡安全競賽-數字取證調查attack817

? 數字取證調查 (一)拓撲圖 服務器場景:FTPServer20221010(關閉鏈接) 服務器場景操作系統:未知 FTP用戶名:attack817密碼:attack817 分析attack.pcapng數據包文件,通過分析數據包attack.pcapng找出惡意用戶第一次訪問HTTP服務的數據包是第幾號,將該號數作為Flag值…

倪海廈:教你正確煮中藥,發揮最大藥效

同樣的一個湯劑,我開給你,你如果煮的方法不對,吃下去效果就沒那么好。 所以,湯,取它的迅捷,速度很快,煮湯的時候還有技巧,你喝湯料的時候,你到底是喝它的氣,…

RTMP流設置超時時間失敗

使用FFmpeg(版本是5.0.3)將rtmp流作為輸入,設置超時時間(使用-timeout參數),結果報錯:Cannot open Connection tcp://XXX:1935?listen&listen_timeout 通過./ffmpeg -help full 命令查看FFmpeg幫助&am…

Evidently:一個神奇的Python庫,機器學習必備!

Evidently 是一個面向數據科學家和機器學習工程師的開源 Python 庫。它有助于評估、測試和監控從驗證到生產的數據和 ML 模型。它適用于表格、文本數據和嵌入。 簡介 Evidently 是一個開源的 Python 工具,旨在幫助構建對機器學習模型的監控,以確保它們的…

2024年網絡安全競賽-A模塊任務解析報告單(詳細每一步)

2024年網絡安全競賽-A模塊任務 一、項目和任務描述: 假定你是某企業的網絡安全工程師,對于企業的服務器系統,根據任務要求確保各服務正常運行,并通過綜合運用登錄和密碼策略、流量完整性保護策略、事件監控策略、防火墻策略等多種安全策略來提升服務器系統的網絡安全防御能…

MyBatis參數獲取和傳遞

1、參數獲取方式 MyBatis可以通過以下兩種方式獲取參數值: #{變量名} 本質是占位符賦值 ${變量名} 本質是字符串拼接,如果拼接的是字符串類型或日期類型,則需要手動添加單引號 2、參數獲取的幾種情況: 2.1 mapper接口方法的參數為單個字…

判斷一個Series序列的值是否為單調遞減Series.is_monotonic_decreasing

【小白從小學Python、C、Java】 【計算機等考500強證書考研】 【Python-數據分析】 判斷一個Series序列中 各值是否單調遞減 s.is_monotonic_decreasing [太陽]選擇題 以下代碼的輸出結果中正確的是? import pandas as pd s1 pd.Series([3,2,1]) s2 pd.Series([3,2,4]) pri…

【代碼隨想錄】算法訓練計劃41

dp 1、343. 整數拆分 題目: 給定一個正整數 n ,將其拆分為 k 個 正整數 的和( k > 2 ),并使這些整數的乘積最大化。 返回 你可以獲得的最大乘積 。 輸入: n 10 輸出: 36 解釋: 10 3 3 4, 3 3 4 36。 思路…

Kotlin Flow 操作符

前言 Kotlin 擁有函數式編程的能力,使用Kotlin開發,可以簡化開發代碼,層次清晰,利于閱讀。 然而Kotlin擁有操作符很多,其中就包括了flow。Kotlin Flow 如此受歡迎大部分歸功于其豐富、簡潔的操作符,巧妙使…

【矩陣論】Chapter 7—Hermite矩陣與正定矩陣知識點總結復習

文章目錄 1 Hermite矩陣2 Hermite二次型3 Hermite正定(非負定矩陣)4 矩陣不等式 1 Hermite矩陣 定義 設 A A A為 n n n階方陣,如果稱 A A A為Hermite矩陣,則需滿足 A H A A^HA AHA,其中 A H A^H AH表示 A A A的共軛轉…

數據結構入門————樹(C語言/零基礎/小白/新手+模擬實現+例題講解)

目錄 1. 樹的概念及其結構 1.1 樹的概念: 1.2 樹的相關概念: 1.3 樹的表示方法: ?編輯 1.4 樹的應用: 2. 二叉樹的概念及其結構 2.1 概念: 2.2 特點: 2.3 特殊二叉樹: 2.4 二叉樹的性質&#xf…

【深度學習】注意力機制(一)

本文介紹一些注意力機制的實現,包括SE/ECA/GE/A2-Net/GC/CBAM。 目錄 一、SE(Squeeze-and-Excitation) 二、ECA(Efficient Channel Attention) 三、GE(Gather-Excite) 四、A2-Net(Double A…

二維碼智慧門牌管理系統升級解決方案:數字鑒權

文章目錄 前言一、數字鑒權的核心機制二、數字鑒權的意義和應用 前言 隨著科技的飛速發展,我們的生活逐漸進入數字化時代。在這個數字化的過程中,數據的安全性和門牌信息的保障變得至關重要。今天,我們要介紹的是二維碼智慧門牌管理系統升級…

【論文復現】zoedepth踩坑

注意模型IO: 保證輸入、輸出精度、類型與復現目標一致。 模型推理的代碼 from torchvision import transforms def image_to_tensor(img_path, unsqueezeTrue):rgb transforms.ToTensor()(Image.open(img_path))if unsqueeze:rgb rgb.unsqueeze(0)return rgbdef…

dockerdesktop 導出鏡像,導入鏡像

總體思路 備份時 容器 > 鏡像 > 本地文件 恢復時 本地文件 > 鏡像 > 容器 備份步驟 首先,把容器生成為鏡像 docker commit [容器名稱] [鏡像名稱] 示例 docker commit nginx mynginx然后,把鏡像備份為本地文件,如果使用的是Docker Desktop,打包備份的文件會自動存…