一、python內存管理機制和調優手段。python
內存管理機制:引用計數,垃圾回收、內存池。函數
引用計數:spa
引用計數是一種很是高效的內存管理手段,當一個Python對象被引用時其引用計數增長1,當其再也不被一個變量引用時則記數減1,當引用記數等於0時對象被刪除。操作系統
垃圾回收:對象
一、引用計數:接口
引用計數也是一種垃圾收集機制,並且也是一種最直觀,最簡單的垃圾收集技術。當 Python 的某
個對象的引用計數降爲 0 時,說明沒有任何引用指向該對象,該對象就成爲要被回收的垃圾了。好比
某個新建對象,它被分配給某個引用,對象的引用計數變爲 1。若是引用被刪除,對象的引用計數爲 0,
那麼該對象就能夠被垃圾回收。不過若是出現循環引用的話,引用計數機制就再也不起有效的做用了 。
內存
二、標記清除內存管理
若是兩個對象的引用計數爲一、可是僅僅存在它們兩之間的循環引用,那麼這兩個對象都是須要被回收的,也就是說,它們的引用計數雖然表現非0,但實際上有效的引用計數爲0,因此先將引用計數摘掉,就會得出這兩個對象的有效計數。效率
三、分帶回收變量
從前面「標記-清除」這樣的垃圾收集機制來看,這種垃圾收集機制所帶來的額外操做實際上與系統
中總的內存塊的數量是相關的,當須要回收的內存塊越多時,垃圾檢測帶來的額外操做就越多,而垃圾
回收帶來的額外操做就越少;反之,當需回收的內存塊越少時,垃圾檢測就將比垃圾回收帶來更少的額
外操做
舉個例子:
當某些內存塊 M 通過了 3 次垃圾收集的清洗以後還存活時,咱們就將內存塊 M 劃到一個集合
A 中去,而新分配的內存都劃分到集合 B 中去。當垃圾收集開始工做時,大多數狀況都只對集合 B 進
行垃圾回收,而對集合 A 進行垃圾回收要隔至關長一段時間後才進行,這就使得垃圾收集機制須要處
理的內存少了,效率天然就提升了。在這個過程當中,集合 B 中的某些內存塊因爲存活時間長而會被轉
移到集合 A 中,固然,集合 A 中實際上也存在一些垃圾,這些垃圾的回收會由於這種分代的機制而
被延遲。
內存池:
1. Python 的內存機制呈現金字塔形狀,-1,-2 層主要有操做系統進行操做;
2. 第 0 層是 C 中的 malloc,free 等內存分配和釋放函數進行操做;
3. 第 1 層和第 2 層是內存池,有 Python 的接口函數 PyMem_Malloc 函數實現,當對象小於
256K 時有該層直接分配內存;
4. 第 3 層是最上層,也就是咱們對 Python 對象的直接操做;
Python 在運行期間會大量地執行 malloc 和 free 的操做,頻繁地在用戶態和核心態之間進行切
換,這將嚴重影響 Python 的執行效率。爲了加速 Python 的執行效率,Python 引入了一個內存池
機制,用於管理對小塊內存的申請和釋放。
Python 內部默認的小塊內存與大塊內存的分界點定在 256 個字節,當申請的內存小於 256 字節
時,PyObject_Malloc 會在內存池中申請內存;當申請的內存大於 256 字節時,PyObject_Malloc 的
行爲將蛻化爲 malloc 的行爲。固然,經過修改 Python 源代碼,咱們能夠改變這個默認值,從而改
變 Python 的默認內存管理行爲。
調優手段(瞭解)
1.手動垃圾回收
2.調高垃圾回收閾值3.避免循環引用(手動解循環引用和使用弱引用)