我创建了一个JSFiddle来查看我可以将多少数据推入浏览器。
代码很简单。它只是试图将尽可能多的字符串推入数组中。 字符串的长度约为300-310个字符。
我的问题是: 结果取决于我的PC上有多少内存? 浏览器到浏览器真的不一样吗?
例如,如果我有8gb的ram,如果我有4gb,我会得到更多吗?
var s = '';
for (var i = 0; i < 300; i++) {
s += 'a';
}
array = [];
count = 0;
function doMore() {
for (var i = 0; i < 1000; i++) {
count++;
array.push(s + count);
}
};
function repeat() {
doMore();
document.body.innerHTML = 'size:' + array.length;
setTimeout(repeat, 100);
}
repeat();
在我的情况下,chrome挂在14850000,我有4GB的ram 这是一个近1500万件物品的阵列。不错我猜
你有同样的人吗? 有人可以告诉我们如何为浏览器提供尽可能多的内存由于
答案 0 :(得分:7)
再次,我的机器有16GB的RAM。我可以看到浏览器的RAM使用量随着它的增加而增加,所以我认为它也受到RAM的限制。
IE crapped out at 16,840,000
Chrome at 14,850,000
Firefox 32,890,000
Safari recycles itself around 8,720,000 (LOL @ Apple)
以下是内存使用情况和firefox http://screencast.com/t/3Xl31yGgHWC
的屏幕截图答案 1 :(得分:4)
假设UTF8,意味着你的'a'是2字节/ 8位。
14,850,000 * 300 = 4455000000个字符
14850000 * 300 * 2 = 8,910,000,000字节
因此我们可以从您的测试中推测Chromes JS引擎中字符串的最大长度为4,455,000,000个字符,或者内存中的大小为8.3 GB。
但是当然这不是正在发生的事情。根据数字,你只有4GB的内存〜4298MB已经出现了,并且有数组变量本身的结构以及java VM和chrome本身等等等等。
更不用说你自己推动s + count不是s,所以随着count中的位数增加,所添加的字符串的长度也会增加。如果s是相同的,那么可能会通过V8引擎实现该值以节省内存。作为参考,由于count变量而增加的附加字符数,以及由于长度非线性增加而增加的字符数是9,7438,889个字符或185.85MB数据。
所以必须在这里发生其他事情。
至于V8 JS引擎的限制:
http://code.google.com/p/v8/issues/detail?id=847
32位内存地址空间是上限,对于64位,该链接建议~1.9GB,尽管它很可能是您的操作系统可以支持的物理上可用的上限。
总结一下:
编辑
答案 2 :(得分:2)
我在Chrome上,我尝试了你的测试,它挂在你提到的相同的14850000上,即使我只有2GB的RAM,我在我的linux安装中运行一个带有Windows的VM,我给了700Mb的ram所以我猜是的铬有限制
答案 3 :(得分:0)
在32位计算机上,您的上限始终为4GB,如果是ands或buts则不会。在实践中,机器与机器将完全不同(打开10个以上的标签并不罕见)
最好的方法:只保留用户正在使用的数据或者无法从服务器中快速检索的任何内容。其他一切,在用户要求时获取。