1.在Python中萬物接對象
2.所有對象中,都會在內存中開辟一塊空間進行存儲
class Person:
pass
p = Person
print(p)
print(id(p))
print(hex(id(p)))
#結果
<class '__main__.Person'>
2495730068704
0x245151aace0
num1 = 2
num2 = 2
print(id(num1), id(num2))
#結果
1632086026576 1632086026576
4.容器對象,存儲的其他對象,僅僅是其他對象的引用,並不是其他對象本身
import sys
class Person:
pass
p1 = Person()
print(sys.getrefcount(p1))
p2 = p1
print(sys.getrefcount(p1))
del p2
print(sys.getrefcount(p1))
del p1
#結果
2
3
2
內存洩露:一個對象在內存中無法使用,沒有被釋放的情況就是內存洩露
#objgraph.count()可以查看,垃圾回收器,跟蹤的對象個數
import objgraph
class Person:
pass
class Dog:
pass
p = Person()
d = Dog()
print(objgraph.count("Person"))
print(objgraph.count("Dog"))
p.pet = d
d.master = p
#刪除p,d之後,對應的對象是否被釋放掉
del p
del d
print(objgraph.count("Person"))
print(objgraph.count("Dog"))
p.pet = d
d.master = p
del p
del d
#結果
1
1
1
從經歷過"引用計數器機制"仍未被釋放的對象中,找到"循環引用",干掉相關對象
import gc
print(gc.get_threshold()) #查看
gc.set_threshold(200, 5, 5) #更改
#結果
(700, 10, 10) 每查10次0代的,查一次1代的,依次類推
import gc
gc.disable()
print(gc.isenabled())
gc.enable()
print(gc.isenabled())
print(gc.get_threshold())
gc.set_threshold(1000, 5, 5) #一般往大調,提升性能,垃圾回收耗時間
##
False
True
(700, 10, 10)
import objgraph
import gc
#定義兩個類
class Person:
pass
class Dog:
pass
#根據這兩個類,創建出兩個實例對象
p = Person()
d = Dog()
#讓兩個實例對象之間互相引用,造成循環引用
p.pet = d
d.master = p
#嘗試刪除可達到引用之後,測試真實對象是否有被回收
del p
del d
#通過"引用計數機制”無法回收,需要借助“垃圾回收機制”
gc.collect() #手動觸發回收,不管垃圾回收機制是否開啟,括號內寫幾就是回收哪一代
print(objgraph.count("Person"))
print(objgraph.count("Dog"))
#
0
0