簡單來講python的內存管理機制有三種python
1)引用計數函數
2)垃圾回收操作系統
3)內存池指針
接下來咱們來詳細講解這三種管理機制
cdn
引用計數是一種很是高效的內存管理手段,當一個pyhton對象被引用時其引用計數增長1,當其再也不被引用時引用計數減1,當引用計數等於0的時候,對象就被刪除了。對象
引用計數也是一種垃圾回收機制,並且是一種最直觀,最簡單的垃圾回收技術。blog
在Python中每個對象的核心就是一個結構體PyObject,它的內部有一個引用計數 ob_refcnt,當python的某個對象引用計數爲0。就說明沒有任何引用指向該對象,該對象就成爲要被回收的垃圾了。接口
舉個栗子: 當一個對象被建立出來,他的引用計數就會+1,當對象被引用的時候,計數繼續增長,當引用它的對象被刪除的時候,它的引用計數就會減小。直到變爲0,此時垃圾回收機制就會把它回收。可是一旦出現循環引用,咱們就得采起新的辦法了。內存
標記清除用來解決循環引用產生的問題,循環引用只有在容器對象纔會產生,好比字典,元祖,列表等。首先爲了追蹤對象,須要每一個容器對象維護兩個額外的指針,用來將容器對象組成一個鏈表,指針分別指向先後兩個容器對象,這樣能夠將對象的循環引用摘除,就能夠得出兩個對象的有效計數。it
代碼實慄
QA: 爲何要搞這兩個鏈表
之因此要剖成兩個鏈表,是基於這樣的一種考慮:如今的unreachable可能存在被root鏈表中的對象,直接或間接引用的對象,這些對象是不能被回收的,一旦在標記的過程當中,發現這樣的對象,就將其從unreachable鏈表中移到root鏈表中;當完成標記後,unreachable鏈表中剩下的全部對象就是名副其實的垃圾對象了,接下來的垃圾回收只需限制在unreachable鏈表中便可。
瞭解分類回收,首先要了解一下,GC的閾值,所謂閾值就是一個臨界點的值。
隨着你的程序運行,Python解釋器保持對新建立的對象,以及由於引用計數爲零而被釋放掉的對象的追蹤。從理論上說,建立==釋放數量應該是這樣子。可是若是存在循環引用的話,確定是建立>釋放數量,當建立數與釋放數量的差值達到規定的閾值的時候,噹噹噹當~分代回收機制就登場啦。
分代回收思想將對象分爲三代(generation 0,1,2)
0表明幼年對象,
1表明青年對象,
2表明老年對象。
根據弱代假說(越年輕的對象越容易死掉,老的對象一般會存活更久。)
新生的對象被放入0代,若是該對象在第0代的一次gc垃圾回收中活了下來,那麼它就被放到第1代裏面(它就升級了)。若是第1代裏面的對象在第1代的一次gc垃圾回收中活了下來,它就被放到第2代裏面。
從上一次第0代gc後,若是分配對象的個數減去釋放對象的個數大於threshold0,那麼就會對第0代中的對象進行gc垃圾回收檢查。
從上一次第1代gc後,若是第0代被gc垃圾回收的次數大於threshold1,那麼就會對第1代中的對象進行gc垃圾回收檢查。
從上一次第2代gc後,若是第1代被gc垃圾回收的次數大於threshold2,那麼就會對第2代中的對象進行gc垃圾回收檢查。
gc每一代垃圾回收所觸發的閾值能夠本身設置。
Python在運行期間會大量地執行malloc和free的操做,頻繁地在用戶態和核心態之間進行切換,這將嚴重影響Python的執行效率。爲了加速Python的執行效 率,Python引入了一個內存池機制,用於管理對小塊內存的申請和釋放。
1.手動垃圾回收
2.避免循環引用(手動解循環引用和使用弱引用)
3.調高垃圾回收閾值
若是個人文章對你有幫助,記得點贊鴨