1. 程式人生 > 其它 >第四節 混合程式設計、類和物件初識

第四節 混合程式設計、類和物件初識

1.什麼是記憶體洩漏?

記憶體洩漏(Memory Leak)是指程式中已動態分配的堆記憶體由於某種原因程式未釋放或無法釋放,造成系統記憶體的浪費,導致程式執行速度減慢甚至系統崩潰等嚴重後果。  

2.記憶體洩漏有什麼危害?

 1、頻繁GC:系統分配給每個應用的記憶體資源都是有限的,記憶體洩漏導致其他元件可用的記憶體變少後,一方面會使得GC的頻率加劇,再發生GC的時候,所有程序都必須等待,GC的頻率越高,使用者越容易感應到卡頓。另一方面記憶體變少,可能使得系統額外分配給該物件一些記憶體,而影響整個系統的執行情況。    2、導致程式執行崩潰:一旦記憶體不足以為某些物件分配所需要的空間,將會導致程式崩潰,造成體驗差。  

3.什麼原因能夠產生記憶體洩漏?

 1.對檔案進行操作後,忘記close  2.濫用全域性變數, 一直往全域性變數新增值,未進行delete  3.程式碼中有“引用迴圈”,就會發生記憶體洩露  

4.如何防禦記憶體洩露?

 a.獲取一個檔案描述符後,操作完成後close  b.只用全域性變數後需要新增del操作  c.迴圈引用時使用弱引用不會增加計數器的值  d.發開介面完成後,使用排查工具檢查一下。  

5.如何發現記憶體洩漏?

 a.強大的監控報警系統,當記憶體達到某值時,通過簡訊郵箱電話等方式告知。  b.線上服務功能延遲卡頓,或服務不可用。    

6.發生了記憶體洩漏如何排查?

 a. python垃圾回收機制
引用計數: 每個物件中都有ob-refcnt來做引用計數。當一個物件...,ob-refcnt就會增加,當引用的物件刪除,                  那麼ob-refcnt就會減少當ob-refcnt為零,就會釋放該物件的記憶體空間
標記清除: 解決迴圈引用的問題。先按需分配,等到沒有空閒記憶體的時候,從暫存器和程式棧上的引用出發,遍歷所有物件和引用把所有能訪問的打標記,最後將沒有標記的物件釋放掉
分代技術: 提高效率,提高垃圾回收的效率,按照存活時間,分成不同的集合。將記憶體塊按照其存活時間劃分為不同的集合。每個集合就稱為一個“代”,垃圾回收的頻率隨代的存活時間增大而減小。Python預設定義分代物件集合,引用數越大,物件的存活時間越長
  b.python記憶體排查工具
1.objgraph
  objgraph.show_growth(limit=20)

2.pympler
  from pympler import tracker
    tr = tracker.SummaryTracker()
    tr.print_diff()
  c.排查技巧
a.對每一個介面壓測,觀察物件引用無變化則進行下一次介面,
b.發現記憶體洩漏介面時,同時觀察記憶體變化和日誌變化的關係
c.介面層(大範圍)->服務層(小範圍)->程式碼塊(更小範圍)
 

7.一次有趣的記憶體洩漏排查過程?

服務狀態:  

定位問題:

1.分析記憶體洩漏的變化趨勢,發現在白天時較為明顯。→介面呼叫驅動洩漏     2.對推送中心對外開發的介面依次壓測,觀察記憶體變化情況   在websocket建立連線處和斷開連線處分別打物件引用情況     觀察日誌發現token失效時,記憶體發生洩漏。→AES庫存在記憶體洩漏?   3.分析程式碼     raise ConnectionRefusedError() 有錯誤  

分析原因:

1.連線未斷開,嘗試return 和 sio.disconnect()   2.查詢官方文件 3.跟蹤原始碼    

解決問題:

from socketio.exceptions import ConnectionRefusedError