javascript - node內(nèi)存溢出問(wèn)題
問(wèn)題描述
<--- 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]
問(wèn)題解答
回答1:執(zhí)行文件的時(shí)候,使用
node --inspect --expose-gc XXX.js
這里面兩個(gè)兩個(gè) flag --inspact 是告訴它通過(guò)chrome devtool 進(jìn)行調(diào)試,--expose-gc 是說(shuō)你可以通過(guò)global.gc()方法主動(dòng)收集內(nèi)存。
執(zhí)行之后就會(huì)有一個(gè)chrome://協(xié)議的鏈接,粘貼進(jìn)chrome,就會(huì)出現(xiàn)最常見(jiàn)的chrome dev tool,在profile 里面,點(diǎn)擊第二欄 Take Heap Snapshot,然后點(diǎn)擊Take Snapshot,記錄一次當(dāng)前heap內(nèi)存使用情況,此時(shí)就會(huì)出現(xiàn)當(dāng)前的內(nèi)存使用情況的快照,然后等一下,讓node程序運(yùn)行一段時(shí)間,再記錄一次,然后點(diǎn)擊左上角的Summary切換成Comparison模式,通過(guò)與第一次的對(duì)比,找到究竟是什么增加了,就能找到具體的問(wèn)題。
其次,可以在可疑的代碼段前后通過(guò) node 全局變量 process 的 memoryUsage 方法,打印出 heap 究竟的使用量,通過(guò)對(duì)比代碼前后使用量的差別,判斷是否有 heap 的泄漏。
通過(guò)題主的報(bào)錯(cuò)信息,像是 express session 記錄時(shí)的問(wèn)題,在寫(xiě) session 的地方多打斷點(diǎn),通過(guò) process.memoryUsage()方法看看究竟是哪里出了問(wèn)題,這個(gè)需要耐心和運(yùn)氣。
回答2:express-session 直接使用內(nèi)存本身就有泄露的問(wèn)題 文檔上已經(jīng)說(shuō)明了 配合mongo或者redis使用
相關(guān)文章:
1. 數(shù)組按鍵值封裝!2. docker不顯示端口映射呢?3. java - 阿里的開(kāi)發(fā)手冊(cè)中為什么禁用map來(lái)作為查詢(xún)的接受類(lèi)?4. Docker for Mac 創(chuàng)建的dnsmasq容器連不上/不工作的問(wèn)題5. python - flask _sqlalchemy 能否用中文作為索引條件6. python3.x - git bash如何運(yùn)行.bat文件?7. 跟蹤器怎么開(kāi)啟無(wú)反應(yīng)8. 主題切換問(wèn)題,用過(guò)別人的webapp在后臺(tái)切換模板主題后手機(jī)端打開(kāi)網(wǎng)頁(yè)就是切換到的主題了9. clone - git sourceTree克隆倉(cāng)庫(kù)時(shí),都不停彈出Password Required彈窗,即時(shí)輸入正確的git賬號(hào)密碼還是彈出10. html5 - 使用echarts中的圖表 一個(gè)頁(yè)面導(dǎo)入了好幾個(gè)js圖表 實(shí)現(xiàn)echarts圖表隨著瀏覽器窗口變化而變化時(shí)出現(xiàn)了問(wèn)題
