2

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

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

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

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

│ ├────863.97 MB (73.72%) -- 隔间([System Principal], 0x5083000)

│ │ ├──819.31 MB (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;
}

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

4

4 回答 4

2

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

记忆狐狸

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

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

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

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

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

于 2012-07-02T14:07:59.333 回答
1

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

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

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

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

于 2012-07-02T14:04:17.350 回答
0

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

于 2012-07-02T14:09:22.453 回答
0

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

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

(b) 使用 Firefox 或 Windows 的 3rd 方实用程序或插件来帮助释放一些内存

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

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

于 2012-07-02T14:22:00.123 回答