簡體   English   中英

如何檢查 nodejs 堆棧和代碼段內存使用情況

[英]How to inspect nodejs stack & code segment memory usage

我的節點進程內存增長緩慢,運行時間更長(超過 2 個月約 1GB),但是堆保持不變(這意味着我的代碼/堆棧正在增長)。 我還嘗試手動調用垃圾收集器,但內存使用情況保持不變。

我該如何進一步調查? 我想確認我的理論並弄清楚為什么我的代碼段/堆棧部分在增長。

我正在使用 node v8 LTS(我知道這是今年的 EOL,我只需要知道是否有辦法解決這個問題)

(此處為 V8 開發人員。)

V8 生成的代碼在堆上,所以如果堆沒有增長,那意味着代碼也沒有增長。

堆棧大小受操作系統限制,通常為 1-8 MB。 由於操作系統只是簡單地殺死運行到堆棧限制的進程,V8 對自身施加了一個更低的限制(略小於 1 兆字節,我認為目前是 984KB),並且如果超過該限制將拋出RangeError 因此,不斷增長的堆棧也不是您的問題。

由於您說 Node/V8 報告的堆內存保持不變,這也意味着大多數“如何調試 Node 中的內存泄漏”教程不適用於您的情況; 這也可能意味着泄漏不在您的(JavaScript)代碼中。

這使得 C++“堆內存”(這與 V8 的托管“堆”非常不同!)成為最有可能的罪魁禍首。 Node 本身以及本機擴展可以自由分配它們自己管理的內存。 也許那里的東西沒有得到適當的清理。 這可能只是一個上游錯誤; 或者可能是您的代碼中的某些內容意外保留了某些嵌入器內存。

我首先要嘗試的是更新 Node 和您已安裝的任何本機擴展。 也許泄漏已經被發現並修復了。

如果這沒有幫助,那么您可以嘗試調查內存的去向。 例如,您可以在啟用 LSan 的情況下從源代碼編譯所有內容,然后查看是否報告了任何內容。 構建一個壓力測試可能會有所幫助,例如一個假客戶端用真實的請求淹沒(測試實例)您的服務器,以嘗試在幾秒鍾或幾分鍾而不是幾個月內觸發可檢查的泄漏實例。 制作這樣一個假客戶端也可能有助於縮小出錯的范圍(例如:也許你會注意到一種類型的請求不會觸發泄漏,但另一種類型的請求會)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM