XMLHttp POST请求导致大量内存泄漏

Vis*_*hnu 5 javascript ajax memory-leaks

我怎样才能避免XHR POST内存泄漏?我浏览了很多关于XHR内存泄漏的网页,但是没有好的解决方案.我的问题几乎与此类似.该 博客解释了问题,但没有解决方案.

我的问题:我有一个连续向服务器发送日期的Web应用程序(2Mb到80Mb),它将发出10到300个请求.这是POST请求.对于GET请求没有像这样的大问题.

我怎么解决这个问题?循环参考,范围,更接近等我尝试但没有成功.我尝试使用delete关键字进行readystate更改,删除以前的xhr对象,尝试重用xhr,xhr引用null,更改编码模式等

这是示例代码.这是我需要的功能

 var base_string =  "ABCDEFGHIJKLMNOPQUST01234567890!@#$%^&:ABCDEFGHIJKLMNOPQUST01234567890!@#$%^&ABCDEFGHIJKLMNOPQUST01234567890!@#$%^&";
            base_string += base_string;  
            base_string += base_string; 
            base_string += base_string; 
            base_string += base_string;  
            base_string += base_string;  
            base_string += base_string;  
            base_string += base_string;  
            base_string += base_string; 
            base_string += base_string;  
            base_string += base_string;  
            base_string += base_string; 
            base_string += base_string;  
            base_string += base_string;  
            base_string += base_string;  
            base_string += base_string;  
            base_string += base_string;  
            base_string += base_string;  
            this.sampleData = base_string;
            var dataToSend = this.sampleData.substring( 0, 2000000 );



           this.xhr = [];
           this.xhr[0] = new XMLHttpRequest();
           function sendRequest (){
               var Self = this;
               Self.xhr[0].onload = function (test) {
                   sendRequest ();
               };

               Self.xhr[0].open("POST", "http://localhost/upload.php" + "?n=" +  Math.random(), true);
               Self.xhr[0].send(dataToSend);
           }
           sendRequest ();
Run Code Online (Sandbox Code Playgroud)

如何在没有内存泄漏的情况下实现此目的?

Hol*_*ill 1

对于您发送的每个请求,您都添加一个新的 onload 处理程序。

Self.xhr[0].onload = function (test) {
    sendRequest ();
};
Run Code Online (Sandbox Code Playgroud)

旧的处理程序此时不会被删除并保留在内存中。垃圾收集器将无法释放内存。

在您的情况下,您只需要一个事件侦听器,因此我建议像这样将侦听器的附件移出 sendRequest 函数,并且内存泄漏应该消失。

this.xhr = [];
this.xhr[0] = new XMLHttpRequest();
xhr[0].onload = function (test) {
    sendRequest ();
};
function sendRequest (){
    xhr[0].open("POST", "http://localhost/upload.php" + "?n=" +  Math.random(), true);
    xhr[0].send(dataToSend);
}
sendRequest (); 
Run Code Online (Sandbox Code Playgroud)

编辑:版本 2

我尝试了另一个版本,它产生了更好的结果。在我的设置中内存从未超过 2.6G。它是 Jaromandas 作品的衍生作品。这基本上是他的版本,添加了removeEventHandler和delete

function sendRequest (){
function run(e){
  xhr.upload.removeEventListener('load',run)
  sendRequest()
}
var xhr = new XMLHttpRequest();
xhr.upload.addEventListener('load', run);
xhr.open("POST", "http://localhost:2345/" + "?n=" +  Math.random(), true);
xhr.send(dataToSend);
delete xhr
}
sendRequest ();
Run Code Online (Sandbox Code Playgroud)