<--- 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]
Lors de l'exécution d'un fichier, utilisez
node --inspect --expose-gc XXX.js
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 的地方多打断点,通过
Les deux indicateurs --inspact lui indiquent de déboguer via Chrome devtool, et --expose-gc signifie que vous pouvez activement collecter de la mémoire via la méthodeprocess.memoryUsage()
global.gc()
. 🎜 🎜Après l'exécution, il y aura un lien vers le protocolechrome://
. Collez-le dans Chrome, et l'outil de développement Chrome le plus courant apparaîtra dans le profil, cliquez sur la deuxième colonne Take Heap. Snapshot, puis cliquez sur Take Snapshot, enregistrez l'utilisation actuelle de la mémoireheap
. À ce moment, un instantané de l'utilisation actuelle de la mémoire apparaîtra. Attendez ensuite, laissez le programme de nœud s'exécuter pendant un moment, enregistrez à nouveau. , puis cliquez sur le coin supérieur gauche. Basculez le modeRésumé
vers le modeComparaison
. En comparant avec la première fois, vous pouvez découvrir ce qui a été ajouté et trouver le spécifique. problème. 🎜 🎜Deuxièmement, vous pouvez imprimer leheap
via la méthodememoryUsage
de la variable globalenode
process
avant et après le segment de code suspect.L'utilisation réelle est déterminée en comparant la différence d'utilisation avant et après le code pour déterminer s'il y a une fuite de
tas
. 🎜 🎜Selon le message d'erreur du sujet, comme le problème lors de l'enregistrement de la session express, ajoutez plus de points d'arrêt là où la session est écrite et utilisez la méthodeprocess.memoryUsage()
pour voir où le Le problème est que cela demande de la patience et de la chance. 🎜express-session utilise directement la mémoire elle-même pour avoir des problèmes de fuite. Le document a déjà indiqué qu'il peut être utilisé avec mongo ou redis
.