精品一区二区三区在线成人,欧美精产国品一二三区,Ji大巴进入女人66h,亚洲春色在线视频

Python垃圾回收機(jī)制總結(jié)

大數(shù)據(jù)
Python中的內(nèi)存管理機(jī)制的層次結(jié)構(gòu)提供了4層,其中最底層則是C運(yùn)行的malloc和free接口,往上的三層才是由Python實現(xiàn)并且維護(hù)的,第一層則是在第0層的基礎(chǔ)之上對其提供的接口進(jìn)行了統(tǒng)一的封裝,因為每個系統(tǒng)都可能差異性。

[[200395]]

Python 垃圾回收機(jī)制

內(nèi)存管理

Python中的內(nèi)存管理機(jī)制的層次結(jié)構(gòu)提供了4層,其中***層則是C運(yùn)行的malloc和free接口,往上的三層才是由Python實現(xiàn)并且維護(hù)的,***層則是在第0層的基礎(chǔ)之上對其提供的接口進(jìn)行了統(tǒng)一的封裝,因為每個系統(tǒng)都可能差異性。 

 

內(nèi)存池

Python為了避免頻繁的申請和刪除內(nèi)存所造成系統(tǒng)切換于用戶態(tài)和核心態(tài)的性能問題,從而引入了內(nèi)存池機(jī)制,專門用來管理小內(nèi)存的申請和釋放。內(nèi)存池分為四層:block、pool、arena和內(nèi)存池。如下圖: 

 

block:有很多種block,不同種類的block都有不同的內(nèi)存大小,申請內(nèi)存的時候只需要找到適合自身大小的block即可,當(dāng)然申請的內(nèi)存也是存在一個上限,如果超過這個上限,則退化到使用***層的malloc進(jìn)行申請。

pool:一個pool管理著一堆有固定大小的內(nèi)存塊,其大小通常為一個系統(tǒng)內(nèi)存頁的大小。

arena:多個pool組合成一個arena。

內(nèi)存池:一個整體的概念。

垃圾回收

Python的GC模塊主要運(yùn)用了引用計數(shù)來跟蹤和回收垃圾。在引用計數(shù)的基礎(chǔ)上,還可以通過“標(biāo)記-清除”解決容器對象可能產(chǎn)生的循環(huán)引用的問題。通過分代回收以空間換取時間進(jìn)一步提高垃圾回收的效率。

引用計數(shù)

原理:當(dāng)一個對象的引用被創(chuàng)建或者復(fù)制時,對象的引用計數(shù)加1;當(dāng)一個對象的引用被銷毀時,對象的引用計數(shù)減1,當(dāng)對象的引用計數(shù)減少為0時,就意味著對象已經(jīng)再沒有被使用了,可以將其內(nèi)存釋放掉。

優(yōu)點(diǎn):引用計數(shù)有一個很大的優(yōu)點(diǎn),即實時性,任何內(nèi)存,一旦沒有指向它的引用,就會被立即回收,而其他的垃圾收集技術(shù)必須在某種特殊條件下才能進(jìn)行無效內(nèi)存的回收。

缺點(diǎn):但是它也有弱點(diǎn),引用計數(shù)機(jī)制所帶來的維護(hù)引用計數(shù)的額外操作與Python運(yùn)行中所進(jìn)行的內(nèi)存分配和釋放,引用賦值的次數(shù)是成正比的,這顯然比其它那些垃圾收集技術(shù)所帶來的額外操作只是與待回收的內(nèi)存數(shù)量有關(guān)的效率要高。同時,引用技術(shù)還存在另外一個很大的問題-循環(huán)引用,因為對象之間相互引用,每個對象的引用都不會為0,所以這些對象所占用的內(nèi)存始終都不會被釋放掉。如下:

標(biāo)記-清除

標(biāo)記-清除的出現(xiàn)打破了循環(huán)引用,也就是它只關(guān)注那些可能會產(chǎn)生循環(huán)引用的對象,顯然,像是PyIntObject、PyStringObject這些不可變對象是不可能產(chǎn)生循環(huán)引用的,因為它們內(nèi)部不可能持有其它對象的引用。Python中的循環(huán)引用總是發(fā)生在container對象之間,也就是能夠在內(nèi)部持有其它對象的對象,比如list、dict、class等等。這也使得該方法帶來的開銷只依賴于container對象的的數(shù)量。

原理:將集合中對象的引用計數(shù)復(fù)制一份副本,這個計數(shù)副本的作用是尋找root object集合(該集合中的對象是不能被回收的)。當(dāng)成功尋找到root object集合之后,首先將現(xiàn)在的內(nèi)存鏈表一分為二,一條鏈表中維護(hù)root object集合,成為root鏈表,而另外一條鏈表中維護(hù)剩下的對象,成為unreachable鏈表。一旦在標(biāo)記的過程中,發(fā)現(xiàn)現(xiàn)在的unreachable可能存在被root鏈表中直接或間接引用的對象,就將其從unreachable鏈表中移到root鏈表中;當(dāng)完成標(biāo)記后,unreachable鏈表中剩下的所有對象就是名副其實的垃圾對象了,接下來的垃圾回收只需限制在unreachable鏈表中即可。

缺點(diǎn):該機(jī)制所帶來的額外操作和需要回收的內(nèi)存塊成正比。

分代

原理:將系統(tǒng)中的所有內(nèi)存塊根據(jù)其存活時間劃分為不同的集合,每一個集合就成為一個“代”,垃圾收集的頻率隨著“代”的存活時間的增大而減小。也就是說,活得越長的對象,就越不可能是垃圾,就應(yīng)該減少對它的垃圾收集頻率。那么如何來衡量這個存活時間:通常是利用幾次垃圾收集動作來衡量,如果一個對象經(jīng)過的垃圾收集次數(shù)越多,可以得出:該對象存活時間就越長。 

責(zé)任編輯:龐桂玉 來源: 36大數(shù)據(jù)
相關(guān)推薦

2021-05-27 21:47:12

Python垃圾回收

2017-06-12 17:38:32

Python垃圾回收引用

2010-09-25 15:33:19

JVM垃圾回收

2017-03-03 09:26:48

PHP垃圾回收機(jī)制

2009-06-23 14:15:00

Java垃圾回收

2021-11-05 15:23:20

JVM回收算法

2010-09-25 15:26:12

JVM垃圾回收

2010-09-16 15:10:24

JVM垃圾回收機(jī)制

2011-07-04 16:48:56

JAVA垃圾回收機(jī)制GC

2015-06-04 09:38:39

Java垃圾回收機(jī)

2011-06-28 12:39:34

Java垃圾回收

2009-12-09 17:28:34

PHP垃圾回收機(jī)制

2010-10-13 10:24:38

垃圾回收機(jī)制JVMJava

2021-12-07 08:01:33

Javascript 垃圾回收機(jī)制前端

2023-03-26 22:48:46

Python引用計數(shù)內(nèi)存

2011-12-26 09:50:05

.NET垃圾回收

2024-02-22 17:15:22

JS垃圾回收機(jī)制

2010-09-26 11:22:22

JVM垃圾回收JVM

2023-02-28 07:56:07

V8內(nèi)存管理

2017-10-12 12:41:11

PHP圾回收機(jī)制變量容器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 白朗县| 贞丰县| 周宁县| 塔城市| 宁远县| 太谷县| 德令哈市| 沾益县| 高安市| 遂宁市| 融水| 沙雅县| 响水县| 安新县| 克东县| 利津县| 安庆市| 诸暨市| 南昌市| 健康| 布拖县| 华容县| 玉环县| 乾安县| 日土县| 福鼎市| 民乐县| 黄石市| 锡林浩特市| 江山市| 武隆县| 闸北区| 南部县| 隆林| 呼和浩特市| 张家港市| 石城县| 长宁县| 海口市| 旺苍县| 佛山市|