node內(nèi)存泄漏排查與修復(fù)過程
前言
之前開發(fā)了一個node接口,該接口使用canvas繪制產(chǎn)品圖提供給java端使用,在運(yùn)行了一段時間后發(fā)現(xiàn)了內(nèi)存泄漏問題
本文淺記下修復(fù)過程(ps:主要是記錄下啟動命令和訪問地址)
正文
內(nèi)存泄漏指的是未被js引擎自動回收的內(nèi)存,它多出現(xiàn)在定時器、dom事件和閉包
而筆者恰好就犯了定時器的問題,如下圖框紅的位置即是修復(fù)過后的代碼
但這似乎并不是主因,內(nèi)存仍然在隨著時間的推移而不斷增加
故,需要借助工具來排查....
首先想到的肯定是node自身提供的inspect選項(xiàng)了
node --inspect --heapsnapshot-signal=SIGUSR2 ./xxx.js
重新啟動后,在chrome瀏覽器訪問chrome://inspect/#devices,正常會出現(xiàn)如下頁面
點(diǎn)擊框紅的位置,進(jìn)入調(diào)試控制臺切換到內(nèi)存選項(xiàng)卡并生成初始快照,方便對比分析
然后訪問接口,嘗試復(fù)現(xiàn)問題
在新的快照中對比,發(fā)現(xiàn)canvas生成的圖片uri會隨著調(diào)用次數(shù)增加,這正是內(nèi)存不斷增加的罪魁禍?zhǔn)?/p>
最后,在代碼中找到生成該data uri的地方
它被掛載到了上下文,根據(jù)該ctx的傳入路徑,它來自變量helpers對象的toWebAttrs方法,該對象被筆者定義到了頁面頂部,即接口回調(diào)的外部,也就是說沿著閉包路徑被留存了
因此,只需要在用完后delete掉即可
到此這篇關(guān)于node內(nèi)存泄漏排查與修復(fù)過程的文章就介紹到這了,更多相關(guān)node內(nèi)存泄漏內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Node.js的強(qiáng)大爬蟲 能直接發(fā)布抓取的文章哦
基于Node.js的強(qiáng)大爬蟲能直接發(fā)布抓取的文章哦!本爬蟲源碼基于WTFPL協(xié)議,感興趣的小伙伴們可以參考一下2016-01-01關(guān)于Node.js中頻繁修改代碼重啟服務(wù)器的問題
這篇文章主要介紹了關(guān)于Node.js中頻繁修改代碼重啟服務(wù)器的問題,本文給大家分享解決辦法,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10詳解如何實(shí)現(xiàn)一個簡單的Node.js腳手架
本篇文章主要介紹了如何實(shí)現(xiàn)一個簡單的Node.js腳手架,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12Node.js中child_process實(shí)現(xiàn)多進(jìn)程
這篇文章主要介紹了Node.js中child_process實(shí)現(xiàn)多進(jìn)程,需要的朋友可以參考下2015-02-02Pycharm配置Node.js運(yùn)行js代碼詳細(xì)過程
在PyCharm中寫JavaScript代碼并進(jìn)行調(diào)試是非常方便的,但是有些用戶可能對如何在PyCharm中準(zhǔn)確地運(yùn)行JavaScript代碼感到困惑,這篇文章主要給大家介紹了關(guān)于Pycharm配置Node.js運(yùn)行js代碼的相關(guān)資料,需要的朋友可以參考下2023-11-11手寫Node靜態(tài)資源服務(wù)器的實(shí)現(xiàn)方法
這篇文章主要介紹了手寫Node靜態(tài)資源服務(wù)器的實(shí)現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03