Stavo eseguendo il debug della mia app per perdite di memoria con Google Chrome Dev Tools: Heap Snapshots e ho notato qualcosa di strano.jQuery's AJAX perdita di memoria del testo di risposta?
Ho fatto una richiesta AJAX per recuperare un grande blog di JSON e apparentemente il testo di risposta non elaborato è rimasto in memoria, causando una perdita di memoria nella mia app.
Mi sembra improbabile che ci sia un'enorme perdita di memoria in $ .ajax, ma speravo in una spiegazione del perché questo è il caso ... se faccio lo stesso esperimento in Vanilla JS la perdita non è mostrato.
1) Pure XHR JavaScript
- fonte: http://jsfiddle.net/HZmT5/2/ (usando
XMLHttpRequest
) - uscita: http://fiddle.jshell.net/HZmT5/2/show/light/
- No perdita mostrato
2) Uso di $ GetJSON
- fonte: http://jsfiddle.net/JmA8v/1/ (usando
$.getJSON
) - uscita: http://fiddle.jshell.net/JmA8v/1/show/light/ (perdita mostrato)
- Leak dimostrato, vedi screenshot:
Screenshot: l'intera risposta HTTP della richiesta XHR bloccato intorno a memoria. "Istantanea 1" è prima che il pulsante venga premuto. "Snapshot 2" è dopo. Si noti lo screenshot qui sotto ed è il confronto del prima/dopo dell'heap.
Lo stesso comportamento non è stato riprodotto nella versione JS pura.
(Naturalmente il HTMLDivElement rimarrà nel mucchio dal momento che è nel DOM, ma sembra inutile che l'oggetto completo JSON rimane nel mucchio)
Potrebbe essere correlato al fatto che '$ .getJSON' restituisce una promessa. –
@JulianAubourg c'è una soluzione/modo per evitarlo? È un bug jQuery o un comportamento previsto? – philfreo
Bene, il comportamento previsto è che tutti gli helper di ajax restituiscano una promessa (e quindi il JSON viene tenuto in memoria per tutta la durata della promessa). Ci siamo presi molta cura del dereferenziamento dell'oggetto XHR per evitare inutili ritenzione di memoria. La cosa strana è che la promessa non è reclamata dal garbage collector nel tuo caso. –