2016-10-10 4 views
1

J'essaie de me débarrasser de la fuite de mémoire, mais ma compréhension des choses est assez faible dans ce domaine et je n'ai personne à demander de l'aide à vous attendre les gars. Mon script tue la RAM du serveur et je n'arrive pas à comprendre ce qui ne va pas dans mon approche.Node.js recherche de fuite de mémoire

J'ai cette fonction:

function getPages(params){ 
    gmail.users.messages.list(params, (err, resp)=>{ 

    for (var message of resp.messages) { 
     message['ownerEmail'] = currentUser; 
     getMessage(message); // this does something with it later 
     var message = null; 
    } 

    if(resp.nextPageToken){ 
     params.pageToken = resp.nextPageToken; 
     getPages(params); 
    } else { 
     // resolve end here... 
    } 

    })//gmail.users.messages.list 
}//fetchPages 
getPages(params); 

Fondamentalement, il reçoit des messages de l'API et doit faire quelque chose par la suite. Il s'exécutera tant qu'il y aura plus de données à récupérer. (tant que nextPageToken existe en réponse).

Maintenant, je couru cette commande:

$ free -lm 

       total  used  free  shared buff/cache available 
Mem:   11935  1808  7643   401  2483  9368 
Low:   11935  4291  7643 
High:    0   0   0 
Swap:   6062   0  6062 

en tant que script est en cours d'exécution buff/cache est en constante augmentation.

  • Qu'est-ce que la fonction buff/cache est réellement et comment est-elle liée à mon script Node?
  • Comment gérer ce qui est mis en mémoire tampon/en cache et comment puis-je tuer/effacer ce genre de choses?
  • Comment optimiser la fonction ci-dessus pour oublier tout ce qui est déjà traité?
  • Comment puis-je m'assurer que le script n'utilise absolument aucune ressource une fois terminé? (J'ai même essayé process.exit à la fin du script)
  • Comment puis-je déboguer et surveiller l'utilisation de la RAM à partir de mon script Node.js?

Répondre

0

Je ne pense pas qu'il y ait une fuite de mémoire. Je pense que vous êtes dans une boucle infinie avec la récursivité. Le gmail.users.messages renvoie la réponse avec le resp.nextPageToken étant présent (je suppose) et puis vous appelez le getPages(params); à nouveau. Pouvez-vous mettre un console.log juste avant l'appel de fonction getPages(params);? Quelque chose comme ça:

if (resp.nextPageToken) { 
    params.pageToken = resp.nextPageToken; 
    console.log('token', params.pageToken) 
    getPages(params); 
} 

et de vérifier combien de fois vous imprimez ceci et si jamais vous sortez de la récursion. En outre, pourquoi définissez-vous le message à null dans l'itération? Il y a une redéfinition de la variable.

+0

Cette partie est correcte. Quand il atteint la fin des pages il ne fournira pas nextPageToken et le code du bloc 'else' sera exécuté ce qui pourrait avoir une méthode de sortie, et la fonction auto-exécution est dans le bloc' if' true – Kunok

+1

@Kunok Pouvez-vous essayer nextTick avant d'appeler getPages et commencer la récursivité? Jetez un coup d'oeil ici: http://stackoverflow.com/questions/8112398/does-use-of-recursive-process-nexttick-let-other-processes-or-threads-work –

+0

Permettez-moi de jeter un coup d'oeil à cela, sera répondre après la lecture – Kunok

0

Vous pouvez utiliser N | Solid (c'est gratuit pour le développement), vous allez lancer votre application dans son emballage. C'est assez facile à utiliser et il vous permet de faire le profil complet où la fuite se produit. Vous pouvez également le faire manuellement avec le débogueur intégré, vérifiez la consommation de mémoire à chaque étape.

0

Juste pour répondre à l'une des questions au sein du poste:

Comment puis-je faire en sorte que script prend absolument zéro des ressources une fois est terminée? (J'ai même essayé process.exit à la fin du script)

Il a eu un malentendu:

http://www.linuxatemyram.com/

Do not Panic! Votre bélier va bien!

Que se passe-t-il? Linux emprunte de la mémoire inutilisée pour la mise en cache de disque. Cela donne l'impression que vous avez peu de mémoire, mais ce n'est pas le cas! Tout va bien!