Maison  >  Questions et réponses  >  le corps du texte

javascript - problème de débordement de mémoire du nœud

<--- 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]
我想大声告诉你我想大声告诉你2713 Il y a quelques jours783

répondre à tous(2)je répondrai

  • 阿神

    阿神2017-05-16 13:31:53

    Lors de l'exécution d'un fichier, utilisez

    node --inspect --expose-gc XXX.jsnode --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 全局变量 processmemoryUsage 方法,打印出 heap
    究竟的使用量,通过对比代码前后使用量的差别,判断是否有 heap 的泄漏。

    通过题主的报错信息,像是 express session 记录时的问题,在写 session 的地方多打断点,通过 process.memoryUsage()

    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éthode global.gc(). 🎜 🎜Après l'exécution, il y aura un lien vers le protocole chrome://. 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émoire heap. À 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 mode Résumé vers le mode Comparaison. 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 le heap via la méthode memoryUsage de la variable globale node 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éthode process.memoryUsage() pour voir où le Le problème est que cela demande de la patience et de la chance. 🎜

    répondre
    0
  • 为情所困

    为情所困2017-05-16 13:31:53

    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

    .

    répondre
    0
  • Annulerrépondre