什么是內存泄露?
內存泄露是那些使用過后,應該被清理卻沒有被清理的內存一直占據着系統資源,通過長時間的累積導致系統崩潰。
Python的垃圾回收機制
1、引用計數
原理:當一個對象的引用被創建或者復制時,對象的引用計數+1,當一個對象的引用被銷毀時,對象的引用計數-1,當對象的引用計數變為0時,就意味着已經沒有再被使用了,可以將其內存釋放掉。
優點:引用計數的優點是實時性,任何對象只要沒有被引用就會被釋放。
缺點:1.維護引用計數需要額外的操作,花費時間和空間。2.引用計數無法解決循環引用問題,當兩個對象互相引用對方時,每個對象的計數都不是0,這些對象永遠不會被引用計數機制回收。
2、標記-清除
標記清除只關注那些可能會產生循環引用的對象,一般都是容器對象,比如列表、字典、類等等。
過程:
1.當觸發標記清除機制時,首先將所有對象及引用計數復制出一份副本,對副本進行以下操作
2.假設AB互相引用對方,遍歷每個對象,如A,如果A中引用了B,則先將B的引用計數-1,然后去看B,如果B引用了A,則將A的引用計數也-1,這樣就將對象的真實有效引用數暴露了出來。
3.遍歷完成后,如果有效引用為0則說明需要回收。
缺點:效率低
3.分代回收
分代回收是用空間換時間,認為如果一個對象存活的時間越長越有可能不是垃圾,把那些在第一次垃圾回收后沒有被清除的對象放入二代,減少標記清除檢查的次數。一共分為三代。