2012-10-16 13 views
8

Nodejs: 0.8.8node.js - possibile la memoria del server http perdita di versione

Ecco il server:

var http = require('http'); 
var port = 1338; 
var ip = "127.0.0.1";  

http.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end('Hi there\n'); 
}).listen(port, ip);  

client (script php) riccioli via una richiesta POST al server sopra. POST è una stringa (json), circa 4 megabyte di dimensione.

Come si può vedere, il server non fa nulla con i dati pubblicati. Per eseguire il debug, ho rimosso tutto il mio codice e sono tornato all'esempio ciao mondo che non fa nulla :)
Quando guardo l'utilizzo della memoria del processo del nodo (fatto in Activity Monitor, mac app) - riporta che l'utilizzo della memoria del server dei nodi sta diventando più grande per ogni richiesta.
Quindi dopo 20 richieste o così l'utilizzo della memoria è raddoppiato.

+4

Chiederò alla domanda da 1000 dollari: node.js alla fine si occupa di tutta la memoria e si blocca o l'utilizzo della memoria tornerà alla fine? – jsalonen

risposta

19

Questo non è un bug. È normale, comportamento previsto.

Node.js è basato su JavaScript, che è un linguaggio raccolto. In breve, ciò che accade è che la memoria non viene liberata subito, ma invece ci vorrà un po 'di tempo prima che la memoria venga liberata (ad esempio, la garbage è raccolta). V8 (che utilizza il nodo) ha effettivamente a very intelligent garbage collector che "assicura l'allocazione veloce degli oggetti, brevi pause nella raccolta dei dati inutili e nessuna frammentazione della memoria".

Per dimostrare questo comportamento, ho eseguito lo script precedente con node.js 0.8.8 su Windows e bombardato il server con richieste HTTP POST di grandi dimensioni.

Process Explorer rivela il grafico seguente utilizzo della memoria:

enter image description here

Come si può vedere, l'utilizzo della memoria va in su, fino a un certo limite che fa scattare la raccolta dei rifiuti. Dopo la pulizia, l'utilizzo viene resettato e ricomincia a salire fino al successivo innesco.

+2

Nei miei test iniziali, ho fatto circa 20 richieste e la memoria ha continuato a salire. Ora dopo aver letto la tua risposta, molto informativa, ho mantenuto le richieste e dopo circa 30 circa, gc ha dato il calcio :) – ado

+0

+1 per la scheda informativa - grazie – zupa

+0

@jsalonen può essere regolato il limite per GC da calciare? – Sir