# -*- 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(不需要我們管理) print(sys.getrefcount(p1)) p2 = p1 print(sys.getrefcount(p1)) # 把對象放入列表中,也會造成計數+1 list1 = [p1] print(sys.getrefcount(p1)) # 創建對象 p3 = People() # 給p3添加obj屬性,屬性值是一個p1對象 也會計數+1 p3.obj = p1 print(sys.getrefcount(p1)) # 當引用被刪除時,引用計數-1 del p2 print(sys.getrefcount(p1)) # 從列表中移除,引用計數-1 del list1[0] print(sys.getrefcount(p1)) # 刪除對象屬性,引用計數-1 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 print('.........')
基於python的-內存管理
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.