我创建了一个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();
Run Code Online (Sandbox Code Playgroud)
在我的情况下,chrome挂在14850000,我有4GB的ram这是一个近1500万件的数组.我猜也好
你们这样做了吗?有人可以告诉我们如何尽可能多地为浏览器提供内存
谢谢
再次,我的机器有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)
Run Code Online (Sandbox Code Playgroud)
这是内存使用的截图和firefox http://screencast.com/t/3Xl31yGgHWC
假设为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的RAM,但根据数字,到处已经出现了约4298MB的内存,而且还有数组变量本身的结构以及Java VM和chrome本身的结构等。
更不用说您自己推动s + count not,因此随着count位数的增加,添加的字符串的长度也在增加。如果s相同,则V8引擎可能会插入该值以节省内存。作为参考,由于count变量以及其长度的非线性增加而添加的其他字符数为9,7438,889个字符或185.85MB的数据。
因此,这里必须发生其他事情。
至于V8 JS引擎的限制:
http://code.google.com/p/v8/issues/detail?id=847
32位内存地址空间是上限,对于64位,该链接建议为1.9 GB,尽管很有可能是您的OS可以支持并物理可用的上限。
总结一下:
编辑: