精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

聊一聊Python中的“垃圾”回收

開發 后端
對于python來說,一切皆為對象,所有的變量賦值都遵循著對象引用機制。程序在運行的時候,需要在內存中開辟出一塊空間,用于存放運行時產生的臨時變量;計算完成后,再將結果輸出到永久性存儲器中。

前言

對于python來說,一切皆為對象,所有的變量賦值都遵循著對象引用機制。程序在運行的時候,需要在內存中開辟出一塊空間,用于存放運行時產生的臨時變量;計算完成后,再將結果輸出到永久性存儲器中。如果數據量過大,內存空間管理不善就很容易出現 OOM(out of memory),俗稱爆內存,程序可能被操作系統中止。而對于服務器,內存管理則顯得更為重要,不然很容易引發內存泄漏- 這里的泄漏,并不是說你的內存出現了信息安全問題,被惡意程序利用了,而是指程序本身沒有設計好,導致程序未能釋放已不再使用的內存。- 內存泄漏也不是指你的內存在物理上消失了,而是意味著代碼在分配了某段內存后,因為設計錯誤,失去了對這段內存的控制,從而造成了內存的浪費。也就是這塊內存脫離了gc的控制。

計數引用

因為python中一切皆為對象,你所看到的一切變量,本質上都是對象的一個指針。當一個對象不再調用的時候,也就是當這個對象的引用計數(指針數)為 0 的時候,說明這個對象永不可達,自然它也就成為了垃圾,需要被回收??梢院唵蔚睦斫鉃闆]有任何變量再指向它。 

  1. import os  
  2. import psutil   
  3.  
  4. # 顯示當前 python 程序占用的內存大小 
  5.  
  6. def show_memory_info(hint):  
  7.     pid = os.getpid()  
  8.     p = psutil.Process(pid)  
  9.     info = p.memory_full_info()  
  10.     memory = info.uss / 1024.1024  
  11. print {} memory used: {} MB .format(hint, memory)) 

可以看到調用函數 func(),在列表 a 被創建之后,內存占用迅速增加到了 433 MB:而在函數調用結束后,內存則返回正常。這是因為,函數內部聲明的列表 a 是局部變量,在函數返回后,局部變量的引用會注銷掉;此時,列表 a 所指代對象的引用數為 0,Python 便會執行垃圾回收,因此之前占用的大量內存就又回來了。 

  1. def func():  
  2.     show_memory_info( 
  3.  initial  
  4.  
  5. global 
  6. a = [i for  i in  range( 10000000 )]  
  7.     show_memory_info( after a created ) 
  8. func()  
  9. show_memory_info( 
  10.  finished  
  11. ) 
  12. ########## 輸出 ##########  
  13. initial memory used: 48.88671875 MB  
  14. after a created memory used:433.94921875 MB  
  15. finished memory used:433.94921875 MB 

新的這段代碼中,global a 表示將 a 聲明為全局變量。那么,即使函數返回后,列表的引用依然存在,于是對象就不會被垃圾回收掉,依然占用大量內存。同樣,如果我們把生成的列表返回,然后在主程序中接收,那么引用依然存在,垃圾回收就不會被觸發,大量內存仍然被占用著:

  1. def func():  
  2.     show_memory_info(  initial  
  3.     a = [i for  i in  derange( 10000000 )]  
  4.     show_memory_info(  after a created 
  5.  
  6. return a  
  7. a = func() 
  8. show_memory_info( finished) 
  9.  
  10. ########## 輸出 ##########  
  11. initial memory used:  47.96484375 MB 
  12. after a created memory used:434.515625 MB 
  13. finished memory used: 434.515625 MB 

那怎么可以看到變量被引用了多少次呢?通過 sys.getrefcount。 

  1. import sys  
  2. a = []  
  3. # 兩次引用,一次來自 a,一次來自 getrefcount 
  4. print (sys.getrefcount(a))  
  5.  
  6. def func(a):  
  7. # 四次引用,a,python 的函數調用棧,函數參數,和 getrefcount  
  8. print (sys.getrefcount(a))  
  9. func(a)  
  10. # 兩次引用,一次來自 a,一次來自 getrefcount,函數 func 調用已經不存在  
  11. print (sys.getrefcount(a))   
  12. ########## 輸出 ##########  
  13.  
  14.  

如果其中涉及函數調用,會額外增加兩次1. 函數棧2. 函數調用。

從這里就可以看到python不再需要像C那種的認為的釋放內存,但是python同樣給我們提供了手動釋放內存的方法 gc.collect()。

  1. import gc  
  2. show_memory_info( initial 
  3. a = [i for  i in range( 10000000 )]  
  4. show_memory_info(  after a created
  5. del a 
  6. gc.collect() 
  7. show_memory_info( finish  
  8. print (a)  
  9. ########## 輸出 ########## 
  10. initial memory used: 48.1015625 MB 
  11. after a created memory used: 434.3828125 MB  
  12. finish memory used: 48.33203125 MB 
  13. --------------------------------------------------------------------------- 
  14. NameErrorTraceback (most recent call last
  15.  
  16. <ipython-input- 12 153e15063d8a > in<module>  
  17. 11  
  18. 12 show_memory_info(  finish ) 
  19. --->  13 print (a) 
  20.  
  21. NameError : name  a  isnotdefined 

截止目前,貌似python的垃圾回收機制非常的簡單,只要對象引用次數為0,必定為觸發gc,那么引用次數為0是否是觸發gc的充要條件呢?

循環回收

如果有兩個對象,它們互相引用,并且不再被別的對象所引用,那么它們應該被垃圾回收嗎? 

  1. def func(): 
  2.     show_memory_info( initial  
  3.     a = [i for  i in  range(10000000)] 
  4.     b = [i for  in  range(10000000)]  
  5.     show_memory_info(  after a, b created  
  6.     a.append(b)  
  7.     b.append(a) 
  8. func() 
  9. show_memory_info(  finished  
  10. ########## 輸出 ##########  
  11. initial memory used: 47.984375 MB  
  12. after a, b created memory used:822.73828125 MB  
  13. finished memory used:  821.73046875 MB 

從結果顯而易見,它們并沒有被回收,但是從程序上來看,當這個函數結束的時候,作為局部變量的a,b就已經從程序意義上不存在了。但是因為它們的互相引用,導致了它們的引用數都不為0。這時要如何規避呢1. 從代碼邏輯上進行整改,避免這種循環引用2. 通過人工回收。 

  1. import gc 
  2. def func():  
  3.     show_memory_info( initial 
  4.     a = [i for  i in  range(10000000)]  
  5.     b = [i for  i in  range(10000000)] 
  6.     show_memory_info( after a, b created 
  7.     a.append(b) 
  8.     b.append(a) 
  9. func() 
  10. gc.collect() 
  11. show_memory_info( finished  
  12. ########## 輸出 ##########  
  13. initial memory used:49.51171875 MB  
  14. after a, b created memory used: 824.1328125 MB  
  15. finished memory used:49.98046875 MB 

python針對循環引用,有它的自動垃圾回收算法1. 標記清除(mark-sweep)算法2. 分代收集(generational)。

標記清除

標記清除的步驟總結為如下步驟1. GC會把所有的『活動對象』打上標記2. 把那些沒有標記的對象『非活動對象』進行回收那么python如何判斷何為非活動對象?通過用圖論來理解不可達的概念。對于一個有向圖,如果從一個節點出發進行遍歷,并標記其經過的所有節點;那么,在遍歷結束后,所有沒有被標記的節點,我們就稱之為不可達節點。顯而易見,這些節點的存在是沒有任何意義的,自然的,我們就需要對它們進行垃圾回收。但是每次都遍歷全圖,對于 Python 而言是一種巨大的性能浪費。所以,在 Python 的垃圾回收實現中,mark-sweep 使用雙向鏈表維護了一個數據結構,并且只考慮容器類的對象(只有容器類對象,list、dict、tuple,instance,才有可能產生循環引用)。

 

圖中把小黑圈視為全局變量,也就是把它作為root object,從小黑圈出發,對象1可直達,那么它將被標記,對象2、3可間接到達也會被標記,而4和5不可達,那么1、2、3就是活動對象,4和5是非活動對象會被GC回收。 

分代回收

分代回收是一種以空間換時間的操作方式,Python將內存根據對象的存活時間劃分為不同的集合,每個集合稱為一個代,Python將內存分為了3“代”,分別為年輕代(第0代)、中年代(第1代)、老年代(第2代),他們對應的是3個鏈表,它們的垃圾收集頻率與對象的存活時間的增大而減小。新創建的對象都會分配在年輕代,年輕代鏈表的總數達到上限時(當垃圾回收器中新增對象減去刪除對象達到相應的閾值時),Python垃圾收集機制就會被觸發,把那些可以被回收的對象回收掉,而那些不會回收的對象就會被移到中年代去,依此類推,老年代中的對象是存活時間最久的對象,甚至是存活于整個系統的生命周期內。同時,分代回收是建立在標記清除技術基礎之上。事實上,分代回收基于的思想是,新生的對象更有可能被垃圾回收,而存活更久的對象也有更高的概率繼續存活。因此,通過這種做法,可以節約不少計算量,從而提高 Python 的性能。所以對于剛剛的問題,引用計數只是觸發gc的一個充分非必要條件,循環引用同樣也會觸發。

調試

可以使用 objgraph來調試程序,因為目前它的官方文檔,還沒有細讀,只能把文檔放在這供大家參閱啦~其中兩個函數非常有用 1. show_refs() 2. show_backrefs()。

 

責任編輯:龐桂玉 來源: 機器學習算法與Python學習
相關推薦

2018-03-13 09:09:07

閃存垃圾回收

2024-03-28 09:02:25

PythonGetattr工具

2022-08-30 07:39:57

C++namespace隔離

2020-12-11 11:11:44

原子類JavaCAS

2021-01-04 08:09:07

Linux內核Watchdog

2023-11-02 08:37:46

Python換行轉義

2021-06-30 07:19:35

微服務業務MySQL

2022-11-09 08:05:15

JavaScriptsuper()

2019-12-12 14:52:10

數據庫腳本

2020-09-08 06:54:29

Java Gradle語言

2022-03-06 20:35:41

并發串行CAP

2024-10-16 15:11:58

消息隊列系統設計

2023-07-06 13:56:14

微軟Skype

2024-04-29 14:58:48

Python內置函數

2024-02-23 15:51:40

PythonBlaze延遲計算

2018-06-07 13:17:12

契約測試單元測試API測試

2021-01-28 22:31:33

分組密碼算法

2020-05-22 08:16:07

PONGPONXG-PON

2023-09-22 17:36:37

2018-07-23 15:28:29

HTTPCookieHeader
點贊
收藏

51CTO技術棧公眾號

91精品国产福利在线观看| 成人国产精品免费网站| 色偷偷av一区二区三区| 国产九九九视频| 91在线超碰| 国产亚洲精品aa| 91影视免费在线观看| 一级片免费网址| 日韩精品免费| 亚洲激情 国产| 亚洲性图一区二区| 大桥未久在线视频| 国产网站一区二区| 国产伦精品一区二区| 日韩人妻精品中文字幕| 一区二区三区在线电影| 亚洲欧美另类自拍| 国产无套精品一区二区三区| 日本高清不卡一区二区三区视频| 亚洲精品国产高清久久伦理二区| 欧美激情第一页在线观看| 国产美女免费看| 丝袜美腿一区二区三区| 欧美激情精品久久久久久黑人| 性高潮久久久久久久| 99国产精品久久一区二区三区| 欧洲国内综合视频| 国产精品免费观看久久| 男人天堂亚洲| 中文字幕亚洲视频| 美国av一区二区三区| 亚洲av无码乱码国产精品| 麻豆久久久久久久| 日本午夜在线亚洲.国产| 国产大片中文字幕| 午夜久久久久| 蜜月aⅴ免费一区二区三区| 中文字幕黄色网址| 精品久久久久中文字幕小说| 日韩精品一二三四区| 色诱av手机版| 日韩在线精品强乱中文字幕| 欧美剧情片在线观看| 天天干天天玩天天操| 日韩成人亚洲| 欧美亚洲愉拍一区二区| 免费观看成人在线视频| 亚洲欧洲日本韩国| 色综合中文字幕国产| 日日碰狠狠添天天爽超碰97| 超碰资源在线| 日韩欧美大尺度| 2022亚洲天堂| 日韩天堂在线| 欧美自拍丝袜亚洲| 天天色综合天天色| 四虎精品永久免费| 91精品国产综合久久久久久漫画| 亚洲免费黄色录像| 欧美专区视频| 精品91自产拍在线观看一区| www.四虎在线| 偷拍一区二区| 亚洲深夜福利视频| 成年人免费视频播放| 视频在线不卡免费观看| 久久的精品视频| 男女免费视频网站| 国产日韩一区二区三区在线| 热久久视久久精品18亚洲精品| 中文字幕精品无码一区二区| 日韩国产精品久久久久久亚洲| 国产成人综合精品| 一级特黄aaa| 国产宾馆实践打屁股91| 国产伦精品一区二区三区免| 头脑特工队2在线播放| 久久久久久黄色| 亚洲精品中文字幕乱码三区不卡 | 丝袜诱惑一区二区| 在线观看亚洲精品| 精品国产免费久久久久久婷婷| 国产精品极品在线观看| 亚洲欧美激情视频| 国产老头老太做爰视频| 在线看片日韩| 国产剧情久久久久久| 精品人妻少妇嫩草av无码专区| 波多野结衣91| 一区二区不卡在线观看| 成年人视频免费在线播放| 色哟哟一区二区| 欧美视频亚洲图片| 欧洲亚洲视频| 久久综合伊人77777蜜臀| 日韩精品久久久久久久| 免费在线观看视频一区| 国产伦精品一区二区三区高清 | 国产精品宾馆| 中文字幕精品在线视频| 日本少妇bbwbbw精品| 日本在线播放一区二区三区| av电影成人| a天堂在线资源| 亚洲一区二区综合| 亚洲小视频网站| 日韩美女精品| 欧美夫妻性生活xx| 中文字幕第31页| av激情亚洲男人天堂| 可以免费看的黄色网址| 日本高清不卡一区二区三区视频 | 九义人在线观看完整免费版电视剧| 亚洲综合成人网| 777视频在线| 亚洲人成网77777色在线播放| 欧美久久精品午夜青青大伊人| 无码人妻精品一区二区蜜桃色欲| 国产91精品在线观看| 亚洲欧美日韩精品久久久| 美女露胸视频在线观看| 日韩欧美另类在线| 日本爱爱小视频| 日本不卡视频在线观看| 欧美大香线蕉线伊人久久国产精品| 综合久久2019| 欧美二区三区91| av网站免费在线看| 免费在线欧美黄色| 精品视频高清无人区区二区三区| 91精品国产91久久久久久青草| 欧美日韩国产成人在线91| 女女互磨互喷水高潮les呻吟| 亚洲乱亚洲高清| 国产伦精品一区二区三区视频免费| 毛片av在线| 欧美群妇大交群中文字幕| 精品欧美一区二区久久久| 久久亚洲图片| 欧美精品123| 亚洲欧美se| 亚洲片在线资源| 天堂网免费视频| 久久综合九色综合欧美就去吻| 久久视频这里有精品| 国产成人一二| 91精品国产乱码久久久久久蜜臀 | 成人看片爽爽爽| 欧美激情国产精品| 色婷婷在线视频| 亚洲成人av电影在线| 美女久久久久久久久| 亚洲另类自拍| 欧美日韩在线不卡一区| 免费欧美电影| 最近2019中文字幕大全第二页 | 一区二区三区在线观看www| 日韩福利在线观看| 欧美乱妇40p| 欧美一级淫片aaaaaa| 精品欧美一区二区三区| 成年人网站免费看| 青青国产91久久久久久| 一区二区av| 6080亚洲理论片在线观看| 97香蕉久久夜色精品国产| 日本一级在线观看| 欧美三级中文字| 日韩精品一区二区亚洲av性色 | 99在线视频首页| 欧美激情20| 日韩亚洲精品视频| 性生活三级视频| 欧美日韩中文字幕在线| 亚洲最大成人综合网| 国模大尺度一区二区三区| 欧美高清中文字幕| 国产成人精品999在线观看| 国产精品丝袜白浆摸在线| a天堂中文在线官网在线| 亚洲第一男人天堂| 中文字幕在线观看1| 夜夜夜精品看看| 熟女俱乐部一区二区视频在线| 久色婷婷小香蕉久久| 精品一二三四五区| 久久综合影院| 99久久自偷自偷国产精品不卡| 国产极品在线观看| 日韩在线欧美在线| 天堂中文资源在线| 欧美一区二区精品| 天堂网免费视频| 亚洲最新视频在线观看| 国产熟女一区二区| av一区二区久久| 中文字幕1234区| 免费在线欧美黄色| av动漫在线免费观看| 精品大片一区二区| 国产精品伊人日日| 日韩护士脚交太爽了| 欧美专区国产专区| 欧美人与动牲性行为| 在线播放国产一区中文字幕剧情欧美| 性色av蜜臀av| 欧美日韩国产成人在线91| a v视频在线观看| 亚洲久草在线视频| 日本美女xxx| 99re热这里只有精品视频| 五月六月丁香婷婷| 免费高清在线视频一区·| 黄色国产一级视频| 亚洲欧美亚洲| 日本免费在线视频观看| 在线看成人短视频| 久久国产精品-国产精品| 日本精品国产| 亚洲自拍偷拍视频| 亚洲精品大片| 国产精品视频99| 亚洲精品一级二级| 日本亚洲欧洲色α| 日本а中文在线天堂| 欧美精品激情在线观看| 菠萝蜜视频国产在线播放| 最近的2019中文字幕免费一页| 亚洲人妻一区二区三区| 欧美精品一区二区三区久久久 | 国产99久久久国产精品潘金网站| 亚洲国产成人va在线观看麻豆| 久久久青草婷婷精品综合日韩| 欧洲精品一区二区三区久久| 欧美午夜电影在线观看 | 亚洲天堂黄色片| 国产精品久久久久久一区二区三区 | 久久天堂影院| 国产精品老女人视频| 毛片免费看不卡网站| 欧洲成人在线观看| 国产精品伦理| 国产精品99免视看9| 日韩欧美一区二区三区免费观看| 欧美专区在线视频| 裤袜国产欧美精品一区| 国产精品高潮在线| 国产精品天堂蜜av在线播放| 国产精品色午夜在线观看| 欧洲精品久久久久毛片完整版| 国产精品自产拍高潮在线观看| 精品久久久网| 亚洲一区二区三| 在线精品国产亚洲| 精品国产乱码久久久久久丨区2区 精品国产乱码久久久久久蜜柚 | 婷婷色综合网| 2021国产视频| 亚洲欧洲视频| 欧美日韩亚洲一二三| 青青青爽久久午夜综合久久午夜 | 午夜视频网站在线观看| 欧美三级日本三级少妇99| 在线视频你懂得| 欧美高清精品3d| 精品久久久中文字幕人妻| 精品日韩在线一区| 偷拍自拍在线视频| 正在播放亚洲1区| 免费a在线看| 久久久久女教师免费一区| a一区二区三区| 国产在线视频一区| 成人精品动漫一区二区三区| 欧美伦理一区二区| 婷婷综合在线| 国产男女免费视频| 免费观看久久久4p| 91精品啪在线观看国产| 久久综合久久久久88| 久久99久久99精品免费看小说| 亚洲国产日日夜夜| 中文精品久久久久人妻不卡| 日韩一区二区影院| 水莓100在线视频| 久久精品视频一| 英国三级经典在线观看| 国产日韩欧美在线观看| 国产精品男女| 亚洲一区在线直播| 亚洲国产高清一区| 欧美国产日韩另类 | 日韩欧美亚洲国产另类| 日韩电影免费| 美女999久久久精品视频| 色在线视频观看| 亚洲综合一区二区不卡| 国产日韩欧美一区二区三区| www.在线观看av| 美国av一区二区| 成人影视免费观看| 亚洲精品久久久蜜桃| 国产精品xxxxxx| 亚洲精品日韩丝袜精品| 18视频在线观看网站| 国产精品福利久久久| 成人涩涩网站| 影音先锋男人的网站| 日韩精品色哟哟| 一级特级黄色片| 亚洲在线一区二区三区| 亚洲午夜精品久久久| 亚洲美女视频网| www视频在线观看| 91观看网站| 97精品中文字幕| 婷婷丁香激情网| 久久蜜桃一区二区| 91久久国产视频| 日韩精品中文字幕一区二区三区 | 5566中文字幕一区二区| 精品精品久久| 日韩精品免费播放| 久久亚洲一级片| 亚洲一区欧美在线| 欧美精品一区二区三区蜜桃视频| 最新av在线播放| 91在线视频精品| 99欧美视频| 成年网站免费在线观看| 国产午夜久久久久| 7799精品视频天天看| 日韩精品免费看| 毛片电影在线| 精品一区在线播放| 一本久道久久久| 精品人妻一区二区免费视频| 亚洲制服丝袜av| 欧洲成人一区二区三区| 久久久久女教师免费一区| 一区二区在线视频观看| 欧美交换配乱吟粗大25p| 国产成人免费xxxxxxxx| 久久久精品国产sm调教网站| 日韩精品一区二区三区在线观看 | 国产视频在线看| 国产精品久久久久久久美男| 欧美精品一区二区久久| 黄色一级免费大片| 欧美高清在线一区| 一级黄色短视频| 久久久久www| 日韩成人久久| 国产中文字幕乱人伦在线观看| www.色综合.com| 99久久久久久久久| 最近中文字幕日韩精品| av在线成人| 久久99久久久久久| 久久女同性恋中文字幕| 欧美高清69hd| 久久中国妇女中文字幕| www.豆豆成人网.com| 欧美日韩亚洲一| 国产精品日韩精品欧美在线| 97人妻一区二区精品免费视频 | 久久久久久久久久久97| 亚洲国产成人爱av在线播放| 波多野结衣久久精品| 亚洲a∨一区二区三区| 国产真实乱偷精品视频免| 久久久久人妻一区精品色欧美| 日韩av中文字幕在线| 91成人抖音| 香港三级日本三级a视频| 91网址在线看| 97人妻人人澡人人爽人人精品| 欧美精品第一页在线播放| 国产精品密蕾丝视频下载| 做a视频在线观看| 精品国产成人av| 秋霞影院午夜丰满少妇在线视频| av一本久道久久波多野结衣| 免费日韩视频| 男人的天堂久久久| 亚洲欧美另类中文字幕| av在线国产精品| 欧美综合在线观看视频| 一区二区成人在线视频| 精品推荐蜜桃传媒| av资源一区二区| 日本伊人午夜精品| 久久露脸国语精品国产91| 色悠悠久久88| 亚洲精品播放| 欧美午夜精品一区二区| 欧美视频一区二区| 男人的天堂免费在线视频| 秋霞在线一区二区| 久久精品这里都是精品| 蜜桃视频在线观看www|