內存泄漏怎麼排查提示詞(Node.js / Java / Python 堆快照對比與常見泄漏點)

服務內存一直漲、跑幾天就被 OOM 殺掉或越來越慢時用:讓 AI 先確認是不是真泄漏,再教你用對應語言的工具抓兩次堆快照做對比,最後對照常見泄漏點審查代碼。

NNathaniel bigo··原創首發·AI 輔助撰寫
通用大模型 對話模型通用
你是一名做過大量線上內存問題排查的後端工程師,熟悉 [語言/運行時] 的內存模型和診斷工具。

現狀:
- 服務類型與部署方式:[服務類型與部署方式](例:Node.js 接口服務,容器限制 1G)
- 內存曲線描述:[如每小時漲 50MB,重啟後歸零]
- 流量特徵:[如白天高峰、夜間幾乎無請求]
- 最近的改動:[最近上線的功能]
- 可疑代碼或已有的監控截圖文字:
  [粘貼內容]

請分四步回答:

第一步:判斷是不是真的泄漏。說明怎麼區分「泄漏」和「正常的緩存增長 / 垃圾回收還沒觸發 / 堆上限設得太大」,比如看流量低谷時內存會不會回落、手動觸發 GC 後是否下降、增長是否和請求數成正比。

第二步:給出這個運行時的診斷方法,寫出具體命令或操作:
- 怎麼在測試環境復現(壓測腳本思路,跑多久);
- 怎麼抓堆快照或內存分析數據,間隔多久抓第二次;
- 兩次快照對比時看什麼:哪類對象數量持續增加、保留它們的引用鏈(retainer / GC root 路徑)是什麼。

第三步:對照這些常見泄漏點審查我貼的代碼,逐條說明有沒有、在哪裏:
- 全局或模組級的 Map、數組、緩存只增不刪,沒有上限或過期;
- 事件監聽、定時器、訂閱註冊後沒有移除;
- 閉包長期持有大對象或請求上下文;
- 連接、文件句柄、流沒有關閉;
- 線程局部變量或請求級對象被存進長生命週期的結構裏。

第四步:給出修復代碼(最小改動),以及上線後怎麼確認修好了(看哪個指標、觀察多長時間)。

要求:命令要寫當前版本真實可用的;對代碼的判斷標明「確定」還是「可疑,需要快照證實」。

高亮處換成你自己的內容:[語言/運行時]、[服務類型與部署方式]、[如每小時漲 50MB,重啟後歸零]、[如白天高峰、夜間幾乎無請求]、[最近上線的功能]、[粘貼內容]

ChatGPT Plus 充值

已被複製 0 次

使用說明

怎麼填變量:[內存曲線描述] 盡量寫數字和規律,「重啟後歸零、每天漲到上限」和「漲到某個值就穩定」是兩種完全不同的情況,後者通常只是緩存。容器限制、JVM 的 -Xmx 等參數一定要寫上。

常見坑:

  • 只抓一次堆快照看不出問題,必須在同樣負載下間隔一段時間抓兩三次做對比,看「持續增長」的那類對象。
  • 進程內的本地緩存(比如用 Map 做的緩存)是最常見的元兇,加上大小上限或改用帶淘汰策略的緩存庫。
  • Python 裏 C 擴展分配的內存不一定出現在 Python 層的分析工具中,看不到不代表沒有。

追問技巧:拿到快照對比結果後,把「增長最多的前幾類對象和引用鏈」的文字貼回去,問「這條引用鏈說明是哪段代碼持有了對象」。

示例輸出

示例,僅供參考(Node.js 接口服務,每小時漲約 50MB)

判斷:夜間流量接近零時內存不回落,且增長量和請求數成正比,基本可以確定是泄漏。

抓快照:

bash
# 啟動時允許通過信號生成堆快照
node --heapsnapshot-signal=SIGUSR2 server.js
# 壓測 10 分鐘後發送一次,再過 10 分鐘發送第二次
kill -USR2 <pid>

在 Chrome DevTools 的 Memory 面板加載兩份快照,選「Comparison」視圖,按 Delta 排序。

代碼審查:

泄漏點結論位置
模組級緩存只增不刪確定userCache 以請求 ID 為鍵,從不刪除
事件監聽未移除可疑每個請求都 emitter.on('done'),需快照證實

同款作品

用這條提示詞做出來的作品;原作者會因此獲得積分

做同款

還沒有同款,來做第一個。

Nathaniel 的更多內容

同主題

同模型

0 條評論

登入 後參與評論

還沒有評論,來搶沙發~