Firefox High Memory (RAM) 使用,如何使用 JavaScript 释放

firefox high memory (RAM) usage, how to free with javascript?

本文关键字:何使用 JavaScript 释放 使用 High Memory RAM Firefox      更新时间:2023-09-26

我注意到在使用Firefox几个小时后,它获得了超过2GB的RAM内存。当我使用 ajax 上传器上传大文件 (100mb-400mb) 时,也会发生这种情况,当我打开许多图像(例如网页上 16mb 的总图像)时也会发生这种情况。

问题是,即使在上传完成后或关闭图像页面后,内存也没有获得空闲,Firefox 仍然有 2GB 的内存。javascript有没有办法让Firefox释放内存,例如在上传完成或加载或关闭图像后?

编辑about:memory :1,172.03 MB (100.0%) -- 显式

├──1,000.00 MB (85.32%) -- js

│ ├────863.97 MB (73.72%) -- 隔间([系统主体], 0x5083000)

│ │ ├──819.31 MB (69.91%) ── 字符串字符

如何清空字符串字符,我很确定这是当文件被读入内存然后使用 ajax 上传时出现的?

编辑 2

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

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;
}

任何点在哪里优化它或在哪里释放对象?

我使用 Memoryfox 插件将 Firefox 的内存保持在最低限度。虽然我只在浏览器上使用它(不要启用"所有进程"选项),因为我经常运行 Photoshop/Lightroom,并且在所有进程模式下它往往会干扰它们(它非常激进)。

记忆狐狸

尽管即使有了那个火狐仍然会膨胀。最好的方法是删除任何您不使用的插件并禁用您不经常使用的插件。如果你有很多插件,有一些会导致Firefox出现重大内存问题,其中一些在MemShrink项目下突出显示。

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

1) 匿名函数的使用意味着每次运行 uploadAjax 时,都会在内存中为每个函数创建一个新函数。在 uploadAjax 外部定义函数,然后引用它们以避免内存中出现重复项。

2)当你完成它时delete xhr;。这通常不是必需的,但如果您要执行大量上传,则可能会留下一些内容。

3)你实际上是在递归和匿名函数中调用uploadAjax(file, endByte, index);,这意味着你在较低级别的调用中创建的所有内容可能仍然存在,而较低级别的调用执行。这将导致多个内存中xhrchunk。考虑以不同的方式调用uploadAjax(例如,通过触发事件,然后从全局访问相同的文件和 xhr,或者在短时间内引入执行断开连接)。我可能会喜欢前者,尽管如果不亲自测试就很难确定)。

这不是你想要的,但听起来这是你需要的:

https://addons.mozilla.org/en-US/firefox/addon/memory-restart/

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

(不过,正如我刚刚发现的 Rob W 一样,about:memory允许您垃圾收集和进行其他内存清理(至少在 Firefox 13 中;没有检查它有多远,因为我在这台机器上没有以前版本的 Firefox,而且我真的没有时间下载和安装以前的版本进行测试)。相当整洁。你可能想先尝试使用它,即使它不是自动的,如果 Firefox 的自动重启不符合你的喜好。

这是火狐浏览器背后发生的最糟糕的事情......我曾经也有这个问题。问题是您必须重新启动浏览器,因此一些内存将可用,但不是全部。单页应用程序的主要问题主要是使用dom替换而不刷新页面。

Firefox 中没有 JavaScript API 来帮助解决您的问题。 Firefox 中的内存使用一直是历史最悠久的抱怨之一,尽管在改善占用空间方面做了很多工作。 您的选择主要限于:

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

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

(c) 使用其他浏览器,例如 Chrome,该浏览器使用按选项卡处理的模型,有助于缓解内存使用问题

仅供参考 - 这是来自Mozilla知识库的更多信息