基於python的-內存管理

# -*- 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('.........')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章