2018-09-14 day20-內存管理機制

python中變量的賦值

  • python中所有的數據都是對象,所有的變量都是對象的引用
  • python對數字、字符串(簡單的字符串)和布爾對象進行緩存,讓不同的變量賦相同值的這些對象,給的地址時緩存的地址。
  • 總結:
    a.給一個變量賦值的時候,賦的是數、字符串和布爾的時候,會在緩存區中看是否有這個值。
    如果有直接將值對應的地址賦給變量。沒有就在緩存中開辟空間存儲數據,然后返回地址
    b.給一個除數字、字符串和布爾的變量賦值時,就直接在內存中開辟空間存儲數據,然后返回地址
  • 一個變量存了對象的地址,那么這個變量就是這個對象的引用

python內存管理機制

c的內存管理機制:手動malloc
java/oc/python : 擁有一套屬于自己的自動內存管理機制

  • python通過垃圾回收機制來對內存進行管理--不定時對程序中的對象進行檢測,看是否需要回收(將內存釋放)。看是否需要回收-就看對象的引用計數是否為0,
    為0就回收。

  • 引用計數: python中每個對象在創建的時候就會有一個屬性叫引用計數,其對應的值就是0。當對象被引用一次,其引用計數加1。當對象的引用減少一個,其引用計數減1


垃圾回收機制

  • 垃圾回收機制并不是一旦產生引用計數為1的對象就馬上回收,而是不定時的對整個程序中的所有對象進行檢測,檢測的時候引用計數為0才回收
  • 在當前程序所有對象引用計數變化的次數達到閾值的時候,才會對對象進行檢測

循環引用

  • 循環引用利用python的垃圾回收機制,能夠自動解決因為循環引用而導致內存泄漏問題
  • 檢測的時候如果對象(object_i)的引用計數不是0,就備份引用計數值,去找到引用這個當前對象的對象(object_j),然后將object_j的引用計數count_j減1。如果count_j減1的值是0,那么count_i的值就減1;如果減完后count_i的值也是0,那么object_i就會銷毀
  • 案例
from sys import getrefcount #查看對象的引用次數
import gc
# 循環引用問題
l1 = []
l2 = []
l1.append(l2)
l2.append(l1)
l3 = l1
# del l1
# del l2
a = int(1)
object2 = [12,122,3]
object3 = object2
# 獲取垃圾回收臨界值
print(gc.get_threshold())
# 函數本身會對查看的對象進行一次引用
print(getrefcount(a),getrefcount(object2))

result:
(700, 10, 10)
108 3
循環引用.png
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容