javascript - node內存溢出問題
問題描述
<--- Last few GCs --->117435494 ms: Mark-sweep 1244.2 (1352.1) -> 1226.4 (1306.1) MB, 2539.5 / 0.0 ms [allocation failure] [GC in old space requested].117437812 ms: Mark-sweep 1226.4 (1306.1) -> 1225.0 (1288.1) MB, 2318.0 / 0.0 ms [last resort gc].117440139 ms: Mark-sweep 1225.0 (1288.1) -> 1224.7 (1288.1) MB, 2326.8 / 0.0 ms [last resort gc].<--- JS stacktrace --->==== JS stack trace =========================================Security context: 0xa0c120cfb39 <JS Object> 1: set [/home/iclassroom/nodejs/cnwkw/node_modules/express-session/session/memory.js:~131] [pc=0x3cd12a011ce7] (this=0x23d9dec61609 <a MemoryStore with map 0x9ff52e70789>, sessionId=0x2ae89ca06ba9 <String[32]: tjNgaUldqGDhIny-NrTy-k2Z14N07L1f>,session=0x2ae89ca06be1 <a Session with map 0x9ff52ed4809>,callback=0x2ae89ca08c79 <JS Function onsave (SharedFunctionInfo 0x173be2d1b1)>) 2: save [...FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 1: node::Abort() [/root/.nvm/versions/node/v6.10.2/bin/node] 2: 0x109b7ac [/root/.nvm/versions/node/v6.10.2/bin/node]
問題解答
回答1:執行文件的時候,使用
node --inspect --expose-gc XXX.js
這里面兩個兩個 flag --inspact 是告訴它通過chrome devtool 進行調試,--expose-gc 是說你可以通過global.gc()方法主動收集內存。
執行之后就會有一個chrome://協議的鏈接,粘貼進chrome,就會出現最常見的chrome dev tool,在profile 里面,點擊第二欄 Take Heap Snapshot,然后點擊Take Snapshot,記錄一次當前heap內存使用情況,此時就會出現當前的內存使用情況的快照,然后等一下,讓node程序運行一段時間,再記錄一次,然后點擊左上角的Summary切換成Comparison模式,通過與第一次的對比,找到究竟是什么增加了,就能找到具體的問題。
其次,可以在可疑的代碼段前后通過 node 全局變量 process 的 memoryUsage 方法,打印出 heap 究竟的使用量,通過對比代碼前后使用量的差別,判斷是否有 heap 的泄漏。
通過題主的報錯信息,像是 express session 記錄時的問題,在寫 session 的地方多打斷點,通過 process.memoryUsage()方法看看究竟是哪里出了問題,這個需要耐心和運氣。
回答2:express-session 直接使用內存本身就有泄露的問題 文檔上已經說明了 配合mongo或者redis使用
相關文章:
1. java - ehcache緩存用的是虛擬機內存么?2. javascript - JS如何取對稱范圍的隨機數?3. 數據庫 - mysql如何處理數據變化中的事務?4. 關于docker下的nginx壓力測試5. java - mongodb分片集群下,count和聚合統計問題6. javascript - 有什么兼容性比較好的辦法來判斷瀏覽器窗口的類型?7. android - java 泛型不支持數組,那么RxJava的Map集合有什么方便的手段可以定義獲得一串共同父類集合數據呢?8. dockerfile - 我用docker build的時候出現下邊問題 麻煩幫我看一下9. java - 自己制作一個視頻播放器,遇到問題,用的是內置surfaceview類,具體看代碼!10. 服務器端 - 采用nginx做web服務器,C++開發應用程序 出現拒絕連接請求?
