<--- 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]
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 的地方多打断点,通过
Dua bendera --inspact memberitahunya untuk nyahpepijat melalui chrome devtool dan --expose-gc bermakna anda boleh mengumpul memori secara aktif melalui kaedahprocess.memoryUsage()
global.gc()
. 🎜 🎜Selepas pelaksanaan, akan ada pautan ke protokolchrome://
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 memoritimbunan
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 modRingkasan
kepadatimbunan
melalui kaedahmemoryUsage
nod
pembolehubah globalproses
sebelum dan selepas segmen kod yang mencurigakanPenggunaan sebenar ditentukan dengan membandingkan perbezaan penggunaan sebelum dan selepas kod untuk menentukan sama ada terdapat kebocoran
heap
. 🎜 🎜Menurut mesej ralat subjek, seperti masalah semasa merakam sesi ekspres, tambahkan lebih banyak titik putus di mana sesi ditulis dan gunakan kaedahprocess.memoryUsage()
untuk melihat di mana masalahnya. Ini memerlukan kesabaran dan keberuntungan. 🎜express-session secara langsung menggunakan memori itu sendiri untuk mengalami masalah kebocoran Dokumen telah menyatakan bahawa ia boleh digunakan dengan mongo atau redis