1. 程式人生 > >Python3 垃圾回收(GC)(一)

Python3 垃圾回收(GC)(一)

1. 小整數物件池


整數在程式中的使用非常廣泛,Python為了優化速度,使用了小整數物件池, 避免為整數頻繁申請和銷燬記憶體空間。

Python 對小整數的定義是 [-5, 257) 這些整數物件是提前建立好的,不會被垃圾回收。在一個 Python 的程式中,所有位於這個範圍內的整數使用的都是同一個物件.

同理,單個字母也是這樣的。

但是當定義2個相同的字串時,引用計數為0,觸發垃圾回收

2. 大整數物件池


每一個大整數,均建立一個新的物件。

3. intern機制

 

a1 = "HelloWorld"
a2 = "HelloWorld"
a3 = "HelloWorld"
a4 = "HelloWorld"
a5 = "HelloWorld"
a6 = "HelloWorld"
a7 = "HelloWorld"
a8 = "HelloWorld"
a9 = "HelloWorld"

python會不會建立9個物件呢?在記憶體中會不會開闢9個”HelloWorld”的記憶體空間呢? 想一下,如果是這樣的話,我們寫10000個物件,比如a1=”HelloWorld”…..a1000=”HelloWorld”, 那他豈不是開闢了1000個”HelloWorld”所佔的記憶體空間了呢?如果真這樣,記憶體不就爆了嗎?所以python中有這樣一個機制——intern機制,讓他只佔用一個”HelloWorld”所佔的記憶體空間。靠引用計數去維護何時釋放。

總結

  • 小整數[-5,257)共用物件,常駐記憶體
  • 單個字元共用物件,常駐記憶體
  • 單個單詞,不可修改,預設開啟intern機制,共用物件,引用計數為0,則銷燬 

 

 

字串(含有空格),不可修改,沒開啟intern機制,不共用物件,引用計數為0,銷燬 

 

大整數不共用記憶體,引用計數為0,銷燬 

 

數值型別和字串型別在 Python 中都是不可變的,這意味著你無法修改這個物件的值,每次對變數的修改,實際上是建立一個新的物件