Rumah > Soal Jawab > teks badan
<--- 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]
阿神2017-05-16 13:31:53
Apabila melaksanakan fail, gunakan
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()
global.gc()
. 🎜
🎜Selepas pelaksanaan, akan ada pautan ke protokol chrome://
Tampalkannya ke dalam chrome, dan alat chrome dev yang paling biasa akan muncul dalam profil, klik pada lajur kedua Take Heap Syot Kilat, dan kemudian klik Ambil Syot Kilat, rakam penggunaan memori timbunan
Pada masa ini, syot kilat penggunaan memori semasa akan muncul, kemudian tunggu, biarkan program nod berjalan sebentar, rakam semula , dan kemudian klik pada penjuru kiri sebelah atas Tukar mod Ringkasan
kepada timbunan
melalui kaedah memoryUsage
nod
pembolehubah global proses
sebelum dan selepas segmen kod yang mencurigakan heap
. 🎜
🎜Menurut mesej ralat subjek, seperti masalah semasa merakam sesi ekspres, tambahkan lebih banyak titik putus di mana sesi ditulis dan gunakan kaedah process.memoryUsage()
untuk melihat di mana masalahnya. Ini memerlukan kesabaran dan keberuntungan. 🎜为情所困2017-05-16 13:31:53
express-session secara langsung menggunakan memori itu sendiri untuk mengalami masalah kebocoran Dokumen telah menyatakan bahawa ia boleh digunakan dengan mongo atau redis