2015-08-28 7 views
14

Ho un'applicazione costruita su restify. Non ho perdite di memoria, tuttavia ho una grande crescita della memoria durante la raccolta di gc, quindi viene eseguito il markup sweep del peso pesante e pulisco la memoria.Come evitare un rapido aumento della memoria durante il lavaggio gc?

Influisce sulle prestazioni della mia applicazione.

[2268] 266859 ms: Scavenge 61.5 (119.5) -> 46.0 (119.5) MB, 2.2 ms [allocation failure]. 
[2268] 267084 ms: Scavenge 63.7 (119.5) -> 48.3 (119.5) MB, 6.2 ms [allocation failure]. 
[2268] 267289 ms: Scavenge 66.0 (119.5) -> 50.6 (119.5) MB, 2.6 ms [allocation failure]. 
[2268] 267504 ms: Scavenge 68.3 (119.5) -> 52.8 (119.5) MB, 2.4 ms [allocation failure]. 
[2268] 267700 ms: Scavenge 70.5 (119.5) -> 55.1 (119.5) MB, 2.7 ms [allocation failure]. 
.... 

[2268] 275913 ms: Scavenge 154.2 (183.5) -> 138.8 (183.5) MB, 2.4 ms [allocation failure]. 
[2268] 276161 ms: Scavenge 157.5 (185.5) -> 142.1 (185.5) MB, 2.7 ms (+ 2.4 ms in 18 steps since last GC) [allocation failure]. 
[2268] 276427 ms: Scavenge 159.8 (187.5) -> 144.3 (187.5) MB, 2.5 ms (+ 36.3 ms in 236 steps since last GC) [allocation failure]. 
[2268] 276494 ms: Mark-sweep 147.7 (188.5) -> 43.7 (121.5) MB, 20.1 ms (+ 45.1 ms in 298 steps since start of marking, biggest step 0.5 ms) [GC interrupt] [GC in old space requested]. 

Questo tipo di comportamento si verifica quando si tenta di accedere non esistente url

ab -c 100 -n 10000000 -k http://localhost:1337/invalid/url 

non posso usare realmente il nodo-ispettore per monitorare ciò che provoca tale crescita memoria intensa perché sarà richiesta completa gc prima di prendere l'istantanea dell'heap.

Quali sono le opzioni per tenere traccia di ciò che causa una crescita così rapida della memoria?

Come scoprire quali oggetti sopravvivono scavenging ma non sopravvivere a mark-sweep gc?

Grazie,

UPDATE 1 Quindi non v'è alcun modo per vedere mezza contenuti scavenging età. Ecco il suggerimento, se vedi una rapida memoria aumentare durante il lavaggio ma poi improvvisamente si abbassa con il mark & sweep, quindi significa che il tuo codice crea dati in grande spazio. Tracce di stack lunghe per esempio. Restify genera gigantesche tracce dello stack che dovrebbero essere disabilitate nella produzione.

risposta

0

Meglio delle mie conoscenze non esiste un modo semplice per vedere i contenuti di mezza età. Tuttavia, se si vede un aumento veloce della memoria durante lo scavenging e quindi un improvviso calo quando si verifica lo swap &, ciò significa generalmente che il codice crea oggetti nello spazio heap elevato. Corde lunghe per esempio.

Rettifica genera gigantesche tracce di stack con ogni oggetto Error che è abbastanza grande da non adattarsi a un nuovo spazio e pertanto deve essere ignorato dal segno & sweep.

3

Si potrebbe provare a eseguire lo script del nodo con l'opzione -–expose-gc:

node --expose-gc script.js

Questo permette di attivare la raccolta dei rifiuti manualmente dall'interno JS:

global.gc();

Quando la raccolta dei rifiuti è applicato manualmente, è possibile applicare una tecnica di snapshot multiple:

  • prendere uno scatto prima, uno scatto dopo GC
  • quindi applicare l'ottimizzazione
  • poi uno scatto prima, uno scatto dopo GC

Le istantanee consentono di monitorare ciò che provoca la crescita di memoria. L'obiettivo è ottenere un risultato migliore del secondo "Snap after GC", rispetto al primo "Snap after GC".

+0

Ci scusiamo per una domanda stupida, ma come faccio a fare uno snapshot senza invocare gc? –

+0

Dopo aver eseguito l'applicazione del nodo, avviare la finestra di ispezione del nodo e connettersi a 'http: //127.0.0.1: 8080/debug? Port = 5858' (o al proprio host anziché localhost) con ad esempio Chrome Dev Tools e quindi andare al Scheda "Profili". Lì troverai "Take Heap Snapshot" e "Record Heap Allocation". –

+0

Sì, è quello che sto facendo. Vedo nei registri che, prima di creare un'istantanea completa, esegue l'intero gc. –

Problemi correlati