python記憶體管理機制詳解

2022-06-26 02:21:12 字數 1831 閱讀 6724

1.1 引用計數+垃圾**機制

import sys

class person:

pass

p1 = person()

p2 = p1

print('p1引用計數:', sys.getrefcount(p1)) # p1引用計數: 3

# del p2

# print('p1引用計數:', sys.getrefcount(p1)) # p2引用計數: 2

print(id(p1)) # 1901831032904

print(id(p2)) # 1901831032904

if p1 is p2:

print('yes') # yes

print(sys.getsizeof(p1)) # 56 bites

1.2 分代**
import sys

class person:

pass

class dog:

pass

p = person()

d = dog()

p.pet = d

d.master = p

print('p引用計數:', sys.getrefcount(p)) # p引用計數: 3

print('d引用計數:', sys.getrefcount(d)) # d引用計數: 3

del p

print('d引用計數:', sys.getrefcount(d)) # d引用計數: 3

2.1 引用計數

引用計數是程式語言總的一種記憶體管理技術,將資源的被引用次數儲存起來。

2.2 標記-清除

2.2.1 標記

在此階段,垃圾**器會從跟物件開始遍歷。

每個可以從根物件訪問到的物件都會被新增標識,這個物件被標識為可到達物件,可到達物件不會被清除。

2.2.2 清除

在此階段,垃圾**器會對堆記憶體從頭到尾進行線性遍歷

如果發現有物件沒有被標識為可到達物件,那麼就此物件記憶體**

之後將原來標記為可到達物件的標識抹掉,以便進行下一次垃圾**操作

2.2.3 標記清除存在的問題

標記-清除演算法的比較大的缺點就是垃圾收集後有可能會造成大量的記憶體碎片,其次由於需要遍歷的記憶體節點較多時,每次**都將花費時間在遍歷節點過程中

2.2.4 注意事項

垃圾收集器

指的是垃圾收集器之外的部分(比如當前的應用程式,可以直接被mutator直接訪問到的物件,一般指靜態---->全域性變數)

所謂的可到達物件就是從根物件開始遍歷,可以訪問到的物件,也就是mutator(應用程式)正在使用的物件

2.3 分代**

2.3.1 核心思想

分代是一種典型的以空間換時間的技術

這種思想簡單點說就是:物件存在時間越長,越可能不是垃圾,應該越少去收集

分代是解決記憶體遍歷需要太久時間而誕生的解決方案

2.3.2 分代**的好處

分代**可以減少標記-清除機制所帶來的額外操作

分代就是將**物件分成數個代(青年代,中年代,老年代),每個代都是乙個鍊錶(集合)。當青年代滿時,將觸發清理所有三代,執行標記清除動作。之後,當中年代滿時,將會觸發清理中年代,老年代;最後,老年代觸發後只會清理自己

老年代的存活時間是最長的

Python記憶體管理機制

一 python記憶體 因為要呼叫while迴圈,迴圈內有temp變數,不清楚python是否會在每一輪迴圈結束後自動釋放temp記憶體空間,做了乙個記憶體測試,發現無論temp none,還是del temp,只能銷毀變數,無法完全釋放記憶體空間。注 紅色部分標出相同記憶體id。python vi...

python記憶體管理機制

a 1整數1為乙個物件。而a是乙個引用。利用賦值語句,引用a指向物件1。在python中,整數和短小的字元,python都會快取這些物件,以便重複使用。當我們建立多個等於1的引用時,實際上是讓所有這些引用指向同乙個物件。a 1 b 1 print id a print id b 在python中,每...

python記憶體管理機制

1.引用計數 當乙個python物件被引用時 其引用計數增加 1 當其不再被變數引用時 引用計數減 1 當物件引用計數等於 0 時,物件被刪除 引用計數是一種非常高效的記憶體管理機制 2.垃圾 垃圾 機制 引用計數 標記清除 分帶 引用計數 引用計數也是一種垃圾收集機制,而且也是一種最直觀,最簡單的...