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.
Ci scusiamo per una domanda stupida, ma come faccio a fare uno snapshot senza invocare gc? –
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". –
Sì, è quello che sto facendo. Vedo nei registri che, prima di creare un'istantanea completa, esegue l'intero gc. –