Co 遞迴呼叫引發的記憶體洩漏

2021-08-18 05:00:14 字數 711 閱讀 8612

我們知道,同步的遞迴寫法,如果在退出遞迴條件失效時,會快速因為棧溢位導致程序掛掉。而在某些場景下,我們會採用非同步的遞迴寫法來規避這個問題:

async

function

recursive()

關鍵字 await 後面的函式呼叫可能會跨越多個 event loop,這樣的寫法下不會出現棧溢位的錯誤。然而這種寫法其實也不是萬無一失的,我們來看下面這個生產故障案例。

客戶接入 node.js 效能平台 後,通過監控經常出現記憶體增長導致的 oom,於是客戶加上了一條告警規則:@heap_used / @heap_limit > 0.5,目的是在堆較小但是發生洩漏時能正常輸出 heapsnapshot 檔案用於分析。

我有幾張阿里雲幸運券分享給你,用券購買或者公升級阿里雲相應產品會有特惠驚喜哦!把想要買的產品的幸運券都領走吧!快下手,馬上就要搶光了。

經過授權,我們得以進入客戶的專案,看到獲取到的 heapsnapshot 檔案,與此同時,可以通過程序趨勢圖看到記憶體飆高引發的一些「併發症」,比如 gc 耗時變久,降低了程序的處理效率:

借助這次順利生成的堆快照(heapsnapshot)檔案,大致能看出記憶體洩漏的地方在**,但想要完全找出來,還有點難度。

第乙個資訊,記憶體洩漏報表:

django 引發「記憶體洩漏」 的問題

早在一年以前,自己寫的乙個程式部署在公司的伺服器上長期執行,後來發現這台機器記憶體經常被這個程序占光,於是懷疑是python記憶體 的問題。最近兩天,這個問題又冒了出來,因為業務的發展,專案中需要的指令碼程式越來越多,所以這個問題必須解決,於是花了兩周的時間一直在排查,而網上也有很多文章描述pyth...

jQuery實時重新整理引發的記憶體洩漏

工作中需要頁面資料的實時重新整理,採用了jquery的ajax實現,前後臺使用json格式資料通訊。有兩個定時器,每3s重新整理一次,執行一段時間後發現頁面記憶體占用了900 m,太恐怖了。除錯步驟如下 1 ajax回傳資料後不做任何操作,在success中直接return,發現記憶體持續增長,沒有...

分裝button元件引發的記憶體洩漏問題

這個問題其實一開始在vue裡寫的時候並沒有注意到這一點,也沒有報錯,直到在react裡寫的時候給我報了一堆錯之後,經各種磨爛之後最終找到是分裝button元件的問題,既然找到問題在哪就好辦了 直接先上 這裡分裝了乙個防抖的元件,為的是不讓按鈕操作在單位時間內過多的請求後台,但是,在路由跳轉中會出現記...