python回收機制

目錄

  • Python的垃圾回收機制
    • 引子:
    • 一、什么是垃圾回收機制?
    • 二、為什么要用垃圾回收機制?
    • 三、垃圾回收機制原理分析
      • 1、什么是引用計數?
      • 2、引用計數擴展閱讀?(折疊)

Python的垃圾回收機制

引子:

我們定義變量會申請內存空間來存放變量的值,而內存的容量是有限的,當一個變量值沒有用了(簡稱垃圾)就應該將其占用的內存給回收掉,而變量名是訪問到變量值的唯一方式,所以當一個變量值沒有關聯任何變量名時,我們就無法再訪問到該變量值了,該變量值就是一個垃圾會被Python解釋的垃圾回收機制自動回收。。。

一、什么是垃圾回收機制?

垃圾回收機制(簡稱GC)是Python解釋器自帶一種機,專門用來回收不可用的變量值所占用的內存空間

二、為什么要用垃圾回收機制?

1程序運行過程中會申請大量的內存空間,而對于一些無用的內存空間如果不及時清理的話會導致內存使用殆盡(內存溢出),導致程序崩潰,因此管理內存是一件重要且繁雜的事情,而python解釋器自帶的垃圾回收機制把程序員從繁雜的內存管理中解放出來。

三、垃圾回收機制原理分析

Python的GC模塊主要運用了“引用計數”(reference counting)來跟蹤和回收垃圾。在引用計數的基礎上,還可以通過“標記-清除”(mark and sweep)解決容器對象可能產生的循環引用的問題,并且通過“分代回收”(generation collection)以空間換取時間的方式來進一步提高垃圾回收的效率。

1、什么是引用計數?

引用計數就是:變量值被變量名關聯的次數

如:name=‘jason'

變量值jason被關聯了一個name,稱之為引用計數為1

引用計數增加:

x=10 (此時,變量值10的引用計數為1)

y=x (此時,把x的內存地址給了y,此時,x,y都關聯了10,所以變量值10的引用計數為2)

引用計數減少:

x=3(此時,x與10解除了關聯,與3 建立了關聯,變量10的引用計數為1)

del y(del的意思是解除變量名y與變量值10的關聯關系,此時,變量10的引用計數為0)

這樣變量值10的引用計數為0,其占用的內存地址就會被回收

2、引用計數擴展閱讀?(折疊)

引用計數機制執行效率問題:變量值被關聯次數的增加或減少,都會引發引用計數機制的執行,這存在明顯的效率問題
如果說執行效率還僅僅是引用計數機制的一個軟肋的話,那么很不幸,引用計數機制還存在著一個致命的弱點,即循環引用(也稱交叉引用)。

# 變量名l1指向列表1,變量名l2指向列表2,如下
>>> l1=['列表1中的第一個元素']  # 列表1被引用一次   
>>> l2=['列表2中的第一個元素']  # 列表2被引用一次 
>>> l1.append(l2)             # 把列表2追加到l1中作為第二個元素,列表2的引用計數為2
>>> l2.append(l1)             # 把列表1追加到l2中作為第二個元素,列表1的引用計數為2
# l1與l2
# l1 = ['列表1中的第一個元素',列表2的內存地址]
# l2 = ['列表2中的第一個元素',列表1的內存地址]

循環引用可以使一組對象的引用計數不為0,然而這些對象實際上并沒有被任何外部對象所引用,它們之間只是相互引用。這意味著不會再有人使用這組對象,應該回收這組對象所占用的內存空間,然后由于相互引用的存在,每一個對象的引用計數都不為0,因此這些對象所占用的內存永遠不會被釋放。比如:

>>> l1
['列表1中的第一個元素', ['列表2中的第一個元素', [...]]]
>>> l2
['列表2中的第一個元素', ['列表1中的第一個元素', [...]]]
>>> l1[1][1][0]
'列表1中的第一個元素'

如果我們執行del l1,列表1的引用計數=2-1,即列表1不會被回收,同理del l2,列表2的引用計數=2-1,此時無論列表1還是列表2都沒有任何名字關聯,但是引用計數均不為0,所以循環引用是致命的,這與手動進行內存管理所產生的內存泄露毫無區別
要解決這個問題,Python引入了其他的垃圾收集機制來彌補引用計數的缺陷:1、“標記-清除” 2、“分代回收”

標記-清除

容器對象(比如:list,set,dict,class,instance)都可以包含對其他對象的引用,所以都可能產生循環引用。而“標記-清除”計數就是為了解決循環引用的問題。

在了解標記清除算法前,我們需要明確一點,內存中有兩塊區域:堆區與棧區,在定義變量時,變量名存放于棧區,變量值存放于堆區,內存管理回收的則是堆區的內容,詳解如下圖

標記/清除算法的做法是當有效內存空間被耗盡的時候,就會停止整個程序,然后進行兩項工作,第一項則是標記,第二項則是清除

標記:標記的過程其實就是,遍歷所有的GC Roots對象(棧區中的所有內容或者線程都可以作為GC Roots對象),然后將所有GC Roots的對象可以直接或間接訪問到的對象標記為存活的對象。

清除:清除的過程將遍歷堆中所有的對象,將沒有標記的對象全部清除掉。

GC roots對象直接訪問到的對象,插圖如下

GC roots對象間接訪問到的對象,插圖如下

用圖形解釋,環引用的例子中的l1與l2,在什么時候啟動標記清除,標記清除的整個過程,插圖

分代回收

背景:

基于引用計數的回收機制,每次回收內存,都需要把所有對象的引用計數都遍歷一遍,這是非常消耗時間的,于是引入了分代回收來提高回收效率,采用“空間換時間的策略”。

什么是分代回收?

分代:

分代回收的核心思想是:在多次掃描的情況下,都沒有被回收的變量,gc機制就會認為,該變量是常用變量,gc對其掃描的頻率會降低,具體實現原理如下:

分代指的是根據存活時間來為變量劃分不同等級(也就是不同的代)

新定義的變量,放到新生代這個等級中,假設每隔1分鐘掃描新生代一次,如果發現變量依然被引用,那么該對象的權重(權重本質就是個整數)加一,當變量的權重大于某個設定得值(假設為3),會將它移動到更高一級的青春代,青春代的gc掃描的頻率低于新生代(掃描時間間隔更長),假設5分鐘掃描青春代一次,這樣每次gc需要掃描的變量的總個數就變少了,節省了掃描的總時間,接下來,青春代中的對象,也會以同樣的方式被移動到老年代中。也就是等級(代)越高,被垃圾回收機制掃描的頻率越低

回收:

回收依然是使用引用計數作為回收的依據

畫圖:

缺點:

例如一個變量剛剛從新生代移入青春代,該變量的綁定關系就解除了,該變量應該被回收,青春代的掃描頻率低于新生代,所以該變量的回收時間被延遲。

轉載于:https://www.cnblogs.com/liushen1995/p/10385528.html

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

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

相關文章

安裝openssl-devel命令

centos: yum install openssl-devel ubuntu: sudo apt-get install openssl sudo apt-get install libssl-dev

阿里云天池 Python訓練營Task2: Python基礎練習:數據結構大匯總 學習筆記

本學習筆記為阿里云天池龍珠計劃Python訓練營的學習內容,學習鏈接為:https://tianchi.aliyun.com/specials/promotion/aicamppython?spm5176.22758685.J_6770933040.1.6f103da1tESyzu 目錄 一、學習知識點概要 二、學習內容 I.列表(list…

windows文件與Linux文件互轉

使用命令 unix2dos filename dos2unix filename

1G.小a的排列(C++)

小a的排列(C) 點擊做題網站鏈接 題目描述 小a有一個長度為n的排列。定義一段區間是"萌"的,當且僅當把區間中各個數排序后相鄰元素的差為1現在他想知道包含數x,y的長度最小的"萌"區間的左右端點 也就是說,我們…

阿里云天池 Python訓練營Task3: Python基礎進階:從函數到高級魔法方法 學習筆記

本學習筆記為阿里云天池龍珠計劃Python訓練營的學習內容,學習鏈接為:https://tianchi.aliyun.com/specials/promotion/aicamppython?spm5176.22758685.J_6770933040.1.6f103da1tESyzu 目錄 一、學習知識點概要 二、學習內容 I.函數 1.定義自己的函…

C# 獲取句柄程序

這個小程序需要用到系統API,也就是需要用到user32中的三個函數。 第一個:WindowFromPoint 返回一個窗口句柄 第二個:GetWindowText 獲取窗口標題 第三個:GetClassName 獲取類名 當然,最重要的一點就是要引用命名空間…

HBase安裝配置

HBase的安裝配置: 4臺主機:hdp0 hdp1 hdp2 hdp3 hdp0 hdp1 跑HMaster hdp2 hdp3 跑HRegionServer 將HBase解壓之后 1、確保安裝ZooKeeper; 2、修改hbase-env.sh export JAVA_HOME/.../jdk export HBASE_MANAGES_ZKfalse //使用外部的…

python cook讀書筆記第2章字符串和文本

使用多個界定符分割字符串 line asdf fjdk; afed, fjek,asdf, fooimport re# line re.split(r[;,\s]\s*,line)# print(line)# [asdf, fjdk, afed, fjek, asdf, foo]"""當你使用 re.split() 函數時候,需要特別注意的是正則表達式中是否包含一個括號…

centos7安裝oracle12c 一

本文 基本參考了下面這篇文章http://blog.csdn.net/gq5251/article/details/42004035 和http://www.linuxidc.com/Linux/2017-08/146528.htm 但是改正了一些錯誤操作系統:CentOS Linux release 7.2.1511 (Core) oracle: oarcle (12.1.0.2.0) - Standard Edition (SE2)幾點要注…

Bigtable的些許重點

分布式數據庫系統 針對于海量數據,可擴展,高吞吐量,低時延 不支持關系模型 通過row和column進行索引,row和column可以是任意字符串 所存儲的數據也是字符串 Bigtable是一個map,value是array of bytes,通…

阿里云天池 Python訓練營Task4: Python數據分析:從0完成一個數據分析實戰 學習筆記

本學習筆記為阿里云天池龍珠計劃Python訓練營的學習內容,學習鏈接為:https://tianchi.aliyun.com/specials/promotion/aicamppython?spm5176.22758685.J_6770933040.1.6f103da1tESyzu 一、學習知識點概要 本次主要通過阿里云天池的賽題【Python入門系…

JMETER從JSON響應中提取數據

如果你在這里,可能是因為你需要使用JMeter從Json響應中提取變量。 好消息!您正在掌握掌握JMeter Json Extractor的權威指南。作為Rest API測試指南的補充,您將學習掌握Json Path Expressions 所需的一切。 我們走吧!并且不要驚慌&…

centos7安裝oracle12c 二

環境:CentOS7VMware12,分配資源:CPU:2顆,內存:4GB,硬盤空間:30GB Oracle 12C企業版64位 下載地址:http://www.oracle.com/technetwork/database/enterprise-edition/down…

阿里云天池 Python訓練營Task5:Python訓練營測試 學習筆記

一、學習知識點概要 本次是Python訓練營的測試,在45分鐘內完成25題,滿分100分及格80分。題目主要考察Task1到Task3里面的Python基礎知識。在我隨到的25道題里,知識點有: 變量(包括數據類型和容器類型)運算…

centos7安裝oracle12c 三

場景描述:我在自己電腦的虛擬機上linux環境下安裝oracle11g數據庫。 Linux版本為:CentOS release 6.8 (Final),Oracle版本為:linux.x64_11gR2 問題描述:在oracle安裝到Prerequisite Checks這一步的時候,出現…

mysql刪除一條記錄

mysql如何刪除一條記錄delete from 表名 where 條件實例:use db1delete from tb1 where id 1; 轉載于:https://www.cnblogs.com/effortsing/p/10393229.html

HBase體系結構

HBase HBase是Apache Hadoop的數據庫,基于HDFS文件系統 random,realtime read/write access to Big Data 開源、分布式、可擴展、面向列 larger tables--billions of rows X millions of columns 不支持表鏈接操作 不支持事務處理 HBase存儲的數據從邏輯上來…

《屬性數據分析引論》 部分課后習題R語言實踐(第三章、第四章)

目錄 前言 第三章 廣義線性模型 習題3.18 a小題 b小題 c小題 d小題 習題3.19 a小題 b小題 c小題 第四章 Logistic回歸 習題4.1 a小題 b小題 c小題 d小題 e小題 習題4.2 a小題 b小題 c小題 d小題 小結 前言 習題選自高等教育出版社譯制,Alan A…

Linux下SVN搭建

在Linux系統中搭建svn服務所需要用到的軟件叫做subversion,可以通過yum來進行安裝,如圖 安裝好軟件后第一件事就是創建一個倉庫目錄 [rootserver1 ~]# mkdir /svn 使用svn自帶命令建立倉庫 [rootserver1 ~]# svnadmin create /svn 進入該倉庫&#xff0c…

HBase模式設計

HBase的使用是為了解決或優化某一問題 恰當的設計模式可以使其具有HBase本身所不具有的功能,并且使其執行效率得到成百上千倍的提高 在進行HBase數據庫模式設計的時候,不當的設置可能對系統的性能產生不良的影響 需要注意: 1、列族的數量及…