Ich debugging meine App für Speicherverluste mit den Google Chrome Dev Tools: Heap Snapshots und bemerkte etwas seltsam.jQuery's AJAX Speicherverlust von Antworttext?
Ich habe eine AJAX-Anfrage gemacht, um einen großen Blog von JSON zu holen, und anscheinend bleibt der rohe Response-Text im Speicher stecken, was zu einem Speicherleck in meiner App führt.
Es erschien mir unwahrscheinlich, dass es ein großes Speicherleck in $ .ajax gibt, aber ich hoffte auf eine Erklärung, warum das der Fall ist ... Wenn ich das gleiche Experiment in Vanille JS mache, ist das Leck nicht gezeigt.
1) Reine JavaScript XHR
- Quelle: http://jsfiddle.net/HZmT5/2/ (mit
XMLHttpRequest
) - Ausgabe: http://fiddle.jshell.net/HZmT5/2/show/light/
- Kein Leck
2) Mit $ .getJSON gezeigt
- Quelle: http://jsfiddle.net/JmA8v/1/ (mit
$.getJSON
) - Ausgang: http://fiddle.jshell.net/JmA8v/1/show/light/ (Leck gezeigt)
- Leak gezeigt, siehe Screenshot
Screenshot: der gesamte HTTP-Antwort des XHR Anfrage stecken herum Erinnerung. "Snapshot 1" ist vor dem Drücken der Taste. "Snapshot 2" ist danach. Beachten Sie den Screenshot unten und es ist der Vergleich des Vorher/Nachher des Heaps.
Das gleiche Verhalten wurde in der Pure-JS-Version nicht reproduziert.
(Natürlich ist die HTMLDivElement wird noch im Haufen bleiben, da es in dem DOM ist, aber es scheint nicht notwendig, dass das volle JSON-Objekt in dem Heap bleibt)
Konnte mit der Tatsache in Beziehung stehen, dass $ .getJSON ein Versprechen zurückgibt. –
@JulianAubourg gibt es einen Workaround/Weg, um es zu vermeiden? Ist es ein jQuery-Bug oder erwartetes Verhalten? – philfreo
Nun, es ist das erwartete Verhalten, dass alle Ajax-Helfer ein Versprechen abgeben (und somit wird das JSON für die gesamte Lebensdauer des Versprechens im Speicher gehalten). Wir haben sehr sorgfältig darauf geachtet, das XHR-Objekt zu dereferenzieren, um unnötige Speichererhaltung zu vermeiden. Was komisch ist, ist, dass das Versprechen in Ihrem Fall nicht vom Müllsammler zurückgefordert wird. –