firefox高内存(RAM)使用率,如何使用javascript释放内存?

firefox高内存(RAM)使用率,如何使用javascript释放内存?,javascript,firefox,memory,ram,Javascript,Firefox,Memory,Ram,我注意到在使用firefox几个小时后,它获得了超过2gb的ram内存。尤其是当我使用ajax uploader上传大文件(100mb-400mb)时,以及当我打开许多图像(例如网页上的总图像数为16mb)时,都会发生这种情况 问题是,即使在上传完成或关闭图像页面后,内存仍不可用,firefox仍有2gb的ram内存。 javascript有没有办法让firefox释放内存,例如在上传完成时或图像加载或关闭后 编辑 从关于:内存: 1172.03 MB(100.0%)--显性 ├──1000.0

我注意到在使用firefox几个小时后,它获得了超过2gb的ram内存。尤其是当我使用ajax uploader上传大文件(100mb-400mb)时,以及当我打开许多图像(例如网页上的总图像数为16mb)时,都会发生这种情况

问题是,即使在上传完成或关闭图像页面后,内存仍不可用,firefox仍有2gb的ram内存。 javascript有没有办法让firefox释放内存,例如在上传完成时或图像加载或关闭后

编辑
关于:内存
:
1172.03 MB(100.0%)--显性

├──1000.00 MB(85.32%)--js

│ ├────863.97MB(73.72%)--隔室([系统原理],0x5083000)

│ │ ├──81931万欧元(69.91%)── 串字符

如何清空字符串字符当文件读入内存,然后用ajax上传时,我确信会出现这种情况

编辑2

以下是导致此内存使用的重现函数:

function uploadAjax(file, startByte, index)
{
    if(startByte==0)
    {
        $('#progress'+index).html(' ').progressbar( "destroy" ).progressbar();
        $('#asyncuploadsingle'+index).attr('disabled', true);
    }

    var size        = file.size;
    var chunkSize   = 2097152;//2 megabyte
    var endByte     = chunkSize + startByte;
    var isLast      = (size - endByte <= 0);
    var chunk       = file;
    var xhr         = new XMLHttpRequest();//prepare xhr for upload
    var chunkNum    = endByte / chunkSize;

    if(chunkSize == 0)//no divide
    {
        chunk   = file;
        isLast  = true;
    }
    else if(file.mozSlice) // moz slice
    {
        chunk   = file.mozSlice(startByte, endByte);
    }
    else if(file.webkitSlice) //webkit slice
    {
        chunk   = file.webkitSlice(startByte, endByte);
    }
    else if(file.slice) // w3c slice
    {
        chunk   = file.slice(startByte, chunkSize);
    }
    else
    {
        chunk   = file;
        isLast  = true;
    }

    //progress function, with ajax upload progress can be monitored
    xhr.upload.addEventListener('progress', function(e)
    {
        if (e.lengthComputable) 
        {
            var perc = Math.round((e.loaded + chunkNum * chunkSize - chunkSize) * 100 / size);
            //console.log(perc+':'+index);
            $('#progress'+index).progressbar("option", "value", perc);
        }  
    }, false); 

    xhr.upload.onabort=function(e)  {   
        finishUp(index,'Aborted');
    };  

    xhr.upload.addEventListener('error', function(e){
        finishUp(index, this.responseText+'--->'+name);
    }, false);  

    xhr.onreadystatechange=function()
    {
        if(this.readyState == 4 && this.status == 200)
        {
            try
            {
                var ret = JSON.parse(this.responseText);

                if(isLast)
                {
                    finishUp(index,'');
                }
                else if(ret.status == 'error')
                {
                    throw ret.info;
                }
                else
                {
                    uploadAjax(file, endByte, index);
                }
            }
            catch(err)
            {
                finishUp(index, err);
            }

            delete chunk;
        }
    };

    var path    = get_final_path();
    var url     = "filetransfer/uploadfiles.php?ax-file-name="+encodeURIComponent(file.name)+"&ax-file-path="+encodeURIComponent(path)+'&ax-start-byte='+startByte;

    xhr.open("POST", url, true);
    xhr.setRequestHeader('Cache-Control', 'no-cache');
    xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');//header
    xhr.setRequestHeader('Content-Type', 'application/octet-stream');//generic stream header

    /*var reader = new FileReader();
    reader.onload = function(evt) {  
        xhr.sendAsBinary(evt.target.result);  
    };  
    reader.readAsBinaryString(chunk);
    */  
    xhr.send(chunk);

    return xhr;
}
函数上传ajax(文件、起始字节、索引)
{
如果(起始字节==0)
{
$('#progress'+index).html('').progressbar(“销毁”).progressbar();
$('asyncuploadsingle'+index).attr('disabled',true);
}
var size=file.size;
var chunkSize=2097152;//2兆字节
var endByte=chunkSize+startByte;

var isLast=(size-endByte这不是您想要的,但听起来这正是您需要的:

您可以为警报设置阈值,甚至让它自动重新启动


(不过,正如我刚刚从Rob W那里了解到的,
about:memory
允许您进行垃圾收集和其他内存清理(至少在Firefox 13中是这样;我还没有检查它的历史,因为我在这台机器上没有Firefox的早期版本,也没有时间下载和安装早期版本进行测试)。非常好。如果Firefox的自动重启不符合您的喜好,即使它不是自动重启的,您也可能希望先尝试使用它。)

我使用Memoryfox插件将Firefox的内存保持在最低限度。尽管我只在浏览器中使用它(不要启用“所有进程”选项)因为我经常运行Photoshop/Lightroom,而且它在所有进程模式下都会对它们产生干扰(这很有攻击性)

尽管如此,firefox仍然会膨胀。最好的方法是删除所有你不使用的插件,并禁用那些你不经常使用的插件。如果你有很多插件,有些插件会导致firefox出现严重的内存问题,有些插件会在下面突出显示

具体参考编辑中提供的代码,您可能会看到额外内存使用的原因有两个:

function uploadAjax(file, startByte, index)
{
    if(startByte==0)
    {
        $('#progress'+index).html(' ').progressbar( "destroy" ).progressbar();
        $('#asyncuploadsingle'+index).attr('disabled', true);
    }

    var size        = file.size;
    var chunkSize   = 2097152;//2 megabyte
    var endByte     = chunkSize + startByte;
    var isLast      = (size - endByte <= 0);
    var chunk       = file;
    var xhr         = new XMLHttpRequest();//prepare xhr for upload
    var chunkNum    = endByte / chunkSize;

    if(chunkSize == 0)//no divide
    {
        chunk   = file;
        isLast  = true;
    }
    else if(file.mozSlice) // moz slice
    {
        chunk   = file.mozSlice(startByte, endByte);
    }
    else if(file.webkitSlice) //webkit slice
    {
        chunk   = file.webkitSlice(startByte, endByte);
    }
    else if(file.slice) // w3c slice
    {
        chunk   = file.slice(startByte, chunkSize);
    }
    else
    {
        chunk   = file;
        isLast  = true;
    }

    //progress function, with ajax upload progress can be monitored
    xhr.upload.addEventListener('progress', function(e)
    {
        if (e.lengthComputable) 
        {
            var perc = Math.round((e.loaded + chunkNum * chunkSize - chunkSize) * 100 / size);
            //console.log(perc+':'+index);
            $('#progress'+index).progressbar("option", "value", perc);
        }  
    }, false); 

    xhr.upload.onabort=function(e)  {   
        finishUp(index,'Aborted');
    };  

    xhr.upload.addEventListener('error', function(e){
        finishUp(index, this.responseText+'--->'+name);
    }, false);  

    xhr.onreadystatechange=function()
    {
        if(this.readyState == 4 && this.status == 200)
        {
            try
            {
                var ret = JSON.parse(this.responseText);

                if(isLast)
                {
                    finishUp(index,'');
                }
                else if(ret.status == 'error')
                {
                    throw ret.info;
                }
                else
                {
                    uploadAjax(file, endByte, index);
                }
            }
            catch(err)
            {
                finishUp(index, err);
            }

            delete chunk;
        }
    };

    var path    = get_final_path();
    var url     = "filetransfer/uploadfiles.php?ax-file-name="+encodeURIComponent(file.name)+"&ax-file-path="+encodeURIComponent(path)+'&ax-start-byte='+startByte;

    xhr.open("POST", url, true);
    xhr.setRequestHeader('Cache-Control', 'no-cache');
    xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');//header
    xhr.setRequestHeader('Content-Type', 'application/octet-stream');//generic stream header

    /*var reader = new FileReader();
    reader.onload = function(evt) {  
        xhr.sendAsBinary(evt.target.result);  
    };  
    reader.readAsBinaryString(chunk);
    */  
    xhr.send(chunk);

    return xhr;
}
1) 使用匿名函数意味着每次运行uploadAjax时都会在内存中创建一个新函数。在uploadAjax之外定义函数,然后引用它们以避免在内存中重复

2)
完成后删除xhr;
。通常不需要这样做,但如果您执行大量上传,可能会留下一些内容


3) 实际上,您正在调用
uploadAjax(文件、endByte、索引)< /代码>递归和内部匿名函数,这意味着您在较高级别调用中创建的所有内容在低级调用执行时仍然存在。这将导致内存中的多个代码<代码> XHR 和 CuxBux/Case>。考虑以不同方式调用<代码>上载AdjAjax < /C> >(比如触发一个事件,然后从全局访问同一个文件和xhr,或者在短时间内引入执行断开连接。我可能倾向于前者,尽管不亲自测试很难说).

这是firefox背后发生的最糟糕的事情…我以前也有这个问题。问题是你必须重新启动浏览器,这样一些内存将是可用的,但不是全部。这是一个页面应用程序的主要问题,它主要是使用dom替换而不刷新页面。

firefox中没有javascript API可以解决帮助解决您的问题。Firefox中的内存使用一直是投诉时间最长的问题之一,尽管在改善内存占用方面做了很多工作。您的选择主要限于:

(a) 重新启动firefox以终止进程并释放其分配的内存

(b) 使用Firefox或Windows的第三方实用程序或插件来帮助释放部分内存

(c) 使用不同的浏览器,例如Chrome,它使用每个选项卡的进程模型,这有助于缓解内存使用问题


仅供参考-

您是否尝试关闭该选项卡?版本是什么?不幸的是,没有。您可以访问
关于:内存
,但仅此而已。Ajax文件上传器?现在听起来非常有趣(这里有讽刺).至于你的问题:不可能。firefox的版本来自5-13@albanx您必须清除对此数据的所有引用。如果您有很多范围,那么这可能不是一项容易的任务(在某些情况下不可能)。只有这样,浏览器才会释放内存(至少在某个时候).顺便说一句:你那里有一个非常有趣的库。我稍后再看。记住,通过AJAX上传文件是不可能的(除非浏览器支持HTML5)。那么他们是如何做到这一点的呢?主要是iFrame的一些技巧。这可能与您的问题有关。问题是我正在开发此上载程序,我不希望这种情况在客户端浏览器中发生,而不是在我的浏览器中。哦,这很好。看起来它甚至集成了
关于:内存的那些功能。
I br在我的回答中应该是这样的。对于客户端浏览器中的内存使用,你无能为力,而是由他们来管理内存。在浏览器中运行的受限范围意味着你必须接受任何可能的限制