1. 程式人生 > >python的記憶體管理--自動管理

python的記憶體管理--自動管理

# -*- 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.當建立一個物件時,這個物件的計數為1
p1 = People()
7. 通過這個函式可以檢視物件的引用計數
  ps:在這查到的是2,自己建立物件的時候+1,編譯程式的時候,直譯器+1(不需要我們管理)
number = sys.getrefcount(p1)
print(number)
8. 當物件被引用的時候,計數會+1
p2 = p1

9.過度釋放

# del p1
# del p2
print(sys.getrefcount(p1))


10.把物件放入列表中,也會造成計數+1
list1 = [p1]
print(sys.getrefcount(p1))
11.建立物件
p3 = People()
 給p3新增一個obj屬性,屬性值是一個p1物件
p3.obj = p1
print(sys.getrefcount(p1))

12. 當引用被刪除的時候,引用計數-1
del p2
print(sys.getrefcount(p1))
13. 從列表中移除,引用計數-1
del list1[0]
print(sys.getrefcount(p1))
14. 刪除物件的屬性
del p3.obj
print(sys.getrefcount(p1))
15. 刪除建立時的引用計數,p1物件會被從記憶體中移除
del p1
# print(sys.getrefcount(p1))
16.  刪除物件
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類的物件被清除了!