python的記憶體管理--自動管理
阿新 • • 發佈:2019-01-03
# -*- coding:utf-8 -*-
1. python中自動管理記憶體的自動管理記憶體程式語言,例如:object-c python
手動管理記憶體程式語言 例如: c
2. python中的記憶體管理採用的 ‘引用計數’的方式,如果一個物件的引用計數為0,該物件佔用的記憶體會被python直譯器清空,物件也會消失,如果一個物件的引用計數超過0,這個物件會一直存放在記憶體中
3. python中是自動管理記憶體的,實際上是通過“引用計數”的方式來管理記憶體。當一個物件被創建出來的時候,引用計數為1,當物件被其他物件引用時,引用計數+1,當物件的引用被刪除時,引用計數會-1,當物件的引用計數為0時,該物件所在的記憶體會被系統在合適的時候回收
4. 物件在記憶體中無法釋放的情況,稱之為記憶體洩漏,記憶體洩漏會導致程式佔用記憶體過多,程式出現卡頓的情況,嚴重情況可能會導致記憶體崩潰,程式結束或者閃退
物件多次刪除,導致引用計數過度減少,在之後的程式碼中有可能導致該物件不可用
5. sys 作業系統模組
import sys
class People(object):
pass
6.當建立一個物件時,這個物件的計數為1p1 = People()
7. 通過這個函式可以檢視物件的引用計數ps:在這查到的是2,自己建立物件的時候+1,編譯程式的時候,直譯器+1(不需要我們管理)
number = sys.getrefcount(p1)
print(number)
8. 當物件被引用的時候,計數會+1p2 = p1
9.過度釋放
# del p1
# del p2
print(sys.getrefcount(p1))
10.把物件放入列表中,也會造成計數+1
11.建立物件list1 = [p1] print(sys.getrefcount(p1))
p3 = People()
給p3新增一個obj屬性,屬性值是一個p1物件p3.obj = p1
print(sys.getrefcount(p1))
12. 當引用被刪除的時候,引用計數-1
del p2
print(sys.getrefcount(p1))
13. 從列表中移除,引用計數-1del list1[0]
print(sys.getrefcount(p1))
14. 刪除物件的屬性del p3.obj
print(sys.getrefcount(p1))
15. 刪除建立時的引用計數,p1物件會被從記憶體中移除16. 刪除物件del p1 # print(sys.getrefcount(p1))
class Man(object):
# 當物件被建立的時候,回去執行初始化函式
def __init__(self):
print('Man類的物件被建立了!')
def eat(self):
print('執行了Man類的eat函式!')
# 當物件被刪除(清除記憶體)的時候,會執行del 函式
def __del__(self):
# 可以在物件被刪除時,新增一些功能:例如,儲存資料。。。
print('Man類的物件被清除了!')
17.執行函式
m = Man()
m.eat()
m1 = m
# 手動刪除物件 引用計數-1
del m
m1.eat()
# 手動刪除物件 引用計數-1 為0 物件被刪除
del m1
18.完整程式碼
# -*- coding:utf-8 -*-
# python中自動管理記憶體的
# 自動管理記憶體程式語言,例如:object-c python
# 手動管理記憶體程式語言 例如: c
# python中的記憶體管理採用的 ‘引用計數’的方式,如果一個物件的引用計數為0,該物件佔用的記憶體會被python直譯器清空,物件也會消失,如果一個物件的引用計數超過0,這個物件會一直存放在記憶體中
# !!!!!!!!!!!!背
# python中是自動管理記憶體的,實際上是通過“引用計數”的方式來管理記憶體。當一個物件被創建出來的時候,引用計數為1,當物件被其他物件引用時,引用計數+1,當物件的引用被刪除時,引用計數會-1,當物件的引用計數為0時,該物件所在的記憶體會被系統在合適的時候回收
'''
物件在記憶體中無法釋放的情況,稱之為記憶體洩漏,記憶體洩漏會導致程式佔用記憶體過多,程式出現卡頓的情況,嚴重情況可能會導致記憶體崩潰,程式結束或者閃退
物件多次刪除,導致引用計數過度減少,在之後的程式碼中有可能導致該物件不可用
'''
# sys 作業系統模組
import sys
class People(object):
pass
# 當建立一個物件時,這個物件的計數為1
p1 = People()
# 通過這個函式可以檢視物件的引用計數
# ps:在這查到的是2,自己建立物件的時候+1,編譯程式的時候,直譯器+1(不需要我們管理)
number = sys.getrefcount(p1)
print(number)
# 當物件被引用的時候,計數會+1
p2 = p1
# 過度釋放
# del p1
# del p2
print(sys.getrefcount(p1))
# 把物件放入列表中,也會造成計數+1
list1 = [p1]
print(sys.getrefcount(p1))
# 建立物件
p3 = People()
# 給p3新增一個obj屬性,屬性值是一個p1物件
p3.obj = p1
print(sys.getrefcount(p1))
# 當引用被刪除的時候,引用計數-1
del p2
print(sys.getrefcount(p1))
# 從列表中移除,引用計數-1
del list1[0]
print(sys.getrefcount(p1))
# 刪除物件的屬性
del p3.obj
print(sys.getrefcount(p1))
# 刪除建立時的引用計數,p1物件會被從記憶體中移除
del p1
# print(sys.getrefcount(p1))
# 刪除物件
class Man(object):
# 當物件被建立的時候,回去執行初始化函式
def __init__(self):
print('Man類的物件被建立了!')
def eat(self):
print('執行了Man類的eat函式!')
# 當物件被刪除(清除記憶體)的時候,會執行del 函式
def __del__(self):
# 可以在物件被刪除時,新增一些功能:例如,儲存資料。。。
print('Man類的物件被清除了!')
m = Man()
m.eat()
m1 = m
# 手動刪除物件 引用計數-1
del m
m1.eat()
# 手動刪除物件 引用計數-1 為0 物件被刪除
del m1
19.執行結果:
2
3
4
5
4
3
2
Man類的物件被建立了!
執行了Man類的eat函式!
執行了Man類的eat函式!
Man類的物件被清除了!