色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術文章
文章詳情頁

總結python 三種常見的內存泄漏場景

瀏覽:27日期:2022-07-04 17:40:37

概要

不要以為 Python 有自動垃圾回收就不會內存泄漏,本著它有“垃圾回收”我有“垃圾代碼”的精神,現(xiàn)在總結一下三種常見的內存泄漏場景。

無窮大導致內存泄漏

如果把內存泄漏定義成只申請不釋放,那么借著 Python 中整數(shù)可以無窮大的這個特點,我們一行代碼就可以完成內存泄漏了。

i = 1024 ** 1024 ** 1024

循環(huán)引用導致內存泄漏

引用記數(shù)器 是 Python 垃圾回收機制的基礎,如果一個對象的引用數(shù)量不為 0 那么是不會被垃圾回收的,我們可以通過 sys.getrefcount 來得到給定對象的引用數(shù)量。

In [1]: import sys In [2]: a = {’name’:’tom’,’age’:16} In [3]: sys.getrefcount(a) # 由于 getrefcount 內部也會臨時的引用 a 所以,使得計數(shù)器的值變成了 2 。 Out[3]: 2In [4]: b = a In [5]: sys.getrefcount(a) Out[5]: 3

先來看一個循環(huán)引用的場景。

#!/usr/bin/evn python3import sysimport timeimport threadingclass Person(object): free_lock = threading.Condition() def __init__(self, name: str = ''): ''' Parameters ---------- name: str 姓名 best_friend: str 最要好的朋友名 ''' self._name = name self._best_friend = None @property def best_friend(self, person: 'Person'): return self._best_friend @best_friend.setter def best_friend(self, friend: 'Person'): self._best_friend = friend def __str__(self): ''' ''' return self._name def __del__(self): ''' ''' self.free_lock.acquire() print(f'{self._name} 要 GG 了,現(xiàn)在釋放它的內存空間。') sys.stderr.flush() self.free_lock.release()def mem_leak(): ''' 循環(huán)引用導致內存泄漏 ''' zhang_san = Person(name=’張三’) li_si = Person('李四') # 構造出循環(huán)引用 # 李四的好友是張三 li_si.best_friend = zhang_san # 張三的好友是李四 zhang_san.best_friend = li_siif __name__ == '__main__': for i in range(3): time.sleep(0.01) print(f'{i}') mem_leak() print('mem_leak 執(zhí)行完成了.') time.sleep(5)

運行效果。

python3 main.py 012mem_leak 執(zhí)行完成了.張三 要 GG 了,現(xiàn)在釋放它的內存空間。李四 要 GG 了,現(xiàn)在釋放它的內存空間。張三 要 GG 了,現(xiàn)在釋放它的內存空間。李四 要 GG 了,現(xiàn)在釋放它的內存空間。張三 要 GG 了,現(xiàn)在釋放它的內存空間。李四 要 GG 了,現(xiàn)在釋放它的內存空間

由于循環(huán)引用的存在,使得 mem_leak 函數(shù)就行執(zhí)行完了其內部的局部變量引用計數(shù)器也不為 0 ,所以內存得不到及時的釋放。釋放這部分內存有兩個途徑 1、 被 Python 內部的循環(huán)檢測機制發(fā)現(xiàn)了; 2、進程退出前的集中釋放。

tracemalloc 可以在一定程序上幫我們發(fā)現(xiàn)問題,在此就不講怎么用了,我們直接上解決方案。Python 為程序員提供了弱引用,通過這種方式可以不增加對象引用計數(shù)器的數(shù)值,這成為了我們打破循環(huán)引用的一種手段。

In [1]: import sys In [2]: import weakref In [3]: from main import Person In [4]: tom = Person(’tom’) In [5]: sys.getrefcount(tom) Out[5]: 2In [6]: p = weakref.ref(tom) In [7]: sys.getrefcount(tom) # 弱引用不會增加計數(shù)器的值Out[7]: 2

現(xiàn)在使用 weakref 技術來改造我們的代碼。

#!/usr/bin/evn python3import sysimport timeimport weakrefimport threadingclass Person(object): free_lock = threading.Condition() def __init__(self, name: str = ''): ''' Parameters ---------- name: str 姓名 best_friend: str 最要好的朋友名 ''' self._name = name self._best_friend = None @property def best_friend(self, person: 'Person'): return self._best_friend @best_friend.setter def best_friend(self, friend: 'Person'): self._best_friend = weakref.ref(friend) def __str__(self): ''' ''' return self._name def __del__(self): ''' ''' self.free_lock.acquire() print(f'{self._name} 要 GG 了,現(xiàn)在釋放它的內存空間。') sys.stderr.flush() self.free_lock.release()def mem_leak(): ''' 循環(huán)引用導致內存泄漏 ''' zhang_san = Person(name=’張三’) li_si = Person('李四') # 構造出循環(huán)引用 # 李四的好友是張三 li_si.best_friend = zhang_san # 張三的好友是李四 zhang_san.best_friend = li_siif __name__ == '__main__': for i in range(3): time.sleep(0.01) print(f'{i}') mem_leak() print('mem_leak 執(zhí)行完成了.') time.sleep(5)

運行效果。

python3 main.py 0張三 要 GG 了,現(xiàn)在釋放它的內存空間。李四 要 GG 了,現(xiàn)在釋放它的內存空間。1張三 要 GG 了,現(xiàn)在釋放它的內存空間。李四 要 GG 了,現(xiàn)在釋放它的內存空間。2張三 要 GG 了,現(xiàn)在釋放它的內存空間。李四 要 GG 了,現(xiàn)在釋放它的內存空間。mem_leak 執(zhí)行完成了.

可以看到現(xiàn)在一旦函數(shù)執(zhí)行完成,其內部的局部變量的內存就會得到釋放,非常的及時。

外面庫導致內存泄漏

這種情況我也只遇到過一次,之前 mysql-connector-python 的內存泄漏,導致我的程序跑著跑著占用的內存就越來越大;最后我們返的 C 語言擴展禁用之后就沒有問題了。

以上就是總結python 三種常見的內存泄漏場景的詳細內容,更多關于python 內存泄漏的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 色拍拍在精品视频69影院在线 | 亚洲欧美精品中文字幕 | 成人国产一区二区三区精品 | 黄www| 一个人看的免费高清视频日本 | 久草在线视频网 | 女人张开腿给人桶免费视频 | 国产国产人免费人成成免视频 | 九七在线视频 | 国产精品亚洲精品影院 | www.亚洲天堂 | 99国产精品免费观看视频 | 12一15女人a毛片 | 秘书高跟黑色丝袜国产91在线 | 欧美一级毛片欧美一级成人毛片 | 国内精品久久久久久久aa护士 | 久色视频在线 | 国产色a在线观看 | 欧美成人a级在线视频 | 日本高清视频在线观看 | a级国产精品片在线观看 | 中国一级毛片录像 | 中文国产日韩欧美视频 | 久久久在线| 成人黄色三级 | 久久久免费观成人影院 | 国产精品久久久久久久久久影院 | 玖玖在线免费视频 | 国产成人一区二区三区影院免费 | 一区二区三区 亚洲区 | 黄色美女视频免费 | 久久久国产亚洲精品 | 国产成人高清在线观看播放 | 国产成人精品一区二区 | 日韩欧美精品在线观看 | 鲁老汉精品视频在线观看 | 国内精品一区二区三区最新 | 日本妞xxxxxxxxx69| 久爱综合 | 欧美a级毛片免费播敢 | 亚洲国产激情一区二区三区 |