Firefox High Memory (RAM) 使用,如何使用 JavaScript 释放
firefox high memory (RAM) usage, how to free with javascript?
我注意到在使用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);
,这意味着你在较低级别的调用中创建的所有内容可能仍然存在,而较低级别的调用执行。这将导致多个内存中xhr
和chunk
。考虑以不同的方式调用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知识库的更多信息
- 正在添加'X'按钮,在文本字段旁边使用javascript
- 使用javascript将动态表从一个html页面打印到另一个html页
- 如何使用javascript或html下载PDF格式的填写表单
- 动态地改变“”的URL;添加新项目”;链接使用javascript/jquery
- 如何使用javascript从主svg对象动态创建svg视图框
- 通过单击表单中的按钮,在代码生成中使用javascript生成字母数字代码
- 使用Javascript获取所选选项ID
- 如果文本字段为空,则使用JavaScript应用CSS样式
- 使用javascript从数据库中添加表
- JSON.parse没有'不能使用Javascript
- 使用javascript检查多个输入值,并在1次检查中标记多个输入框
- 可以't使用JavaScript获取width属性
- 如何使用javascript获取嵌套对象中所有子对象的单个属性
- 使用javascript在Flash中加载外部图像
- 使用Javascript创建测验页面
- 在PHP中使用javascript更改页面标题'if'
- 使用javascript函数在页面初始化后加载jquery
- 无法使用javascript检索SPList项
- 使用javascript存储变量的最安全方式
- 使用javascript搜索具有用户输入的数组