首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >localStorage导致浏览器崩溃

localStorage导致浏览器崩溃
EN

Stack Overflow用户
提问于 2014-02-11 15:19:46
回答 1查看 2.6K关注 0票数 4

localStorageTest在localStorage中存储一个递增的值,直到达到浏览器的localStorage大小限制为止。

代码语言:javascript
复制
function localStorageTest(key, len) {
   var value = window.localStorage.getItem(key); 
   value = (value == null)?"":value;
   var numIters = len - value.length;
   while(numIters--) {
       value += "1";
       window.localStorage.setItem(key, value);
       if (window.localStorage.getItem(key) != value) {
           console.log("limit reached at " + (value.length-1).toString() + " bytes");
           break;
       }
   }
   console.log("stored " + value.length + " bytes");
}

铬:

代码语言:javascript
复制
localStorageTest("1", 80000);
<browser crashed>

Firefox:

代码语言:javascript
复制
localStorageTest("1", 50000);
<browser crashed>

由于怀疑浏览器内存的使用量增加,我编写了localStorageIncrementalTest,它与localStorageTest做同样的事情,但在操作之间放置5秒的空闲时间,使用setTimeOut调用。

代码语言:javascript
复制
var increment = 5000;

function localStorageIncrementalTest(key, len) {
   var value = window.localStorage.getItem(key); 
   value = (value == null)?"":value;
   var numIters = len - value.length;
   var limitReached = false;
   while(numIters--) {
       value += "1";
       window.localStorage.setItem(key, value);
       if (window.localStorage.getItem(key) != value) {
           console.log("limit reached at " + (value.length-1).toString() + " bytes");
           limitReached = true;
           break;
       }
   }
   console.log("stored " + value.length + " bytes");
   if (!limitReached) {
       setTimeout(function() {
           localStorageIncrementalTest(key, len+increment);
       }, 5000);    
   }
}

铬:

代码语言:javascript
复制
localStorageIncrementalTest("1", 30000);
stored 30000 bytes
stored 35000 bytes
...
stored 1800000 bytes
<browser crashed>

Firefox:

代码语言:javascript
复制
localStorageIncrementalTest("1", 30000);
stored 30000 bytes
stored 35000 bytes
...
stored 60000 bytes
<browser crashed>

因此,在浏览器崩溃之前,localStorageIncrementalTest允许我们在localStorage中存储比localStorageTest更多的内容。

有人能解释一下造成浏览器崩溃的原因,以及避免这种情况的可能解决方案吗?

我使用的是Chrome 28.0.1500.71和Firefox 26.0

更新

代码语言:javascript
复制
function getRandomValue(size) {
    var value = "";
    for (var i = 0; i < size; i++) {
            value += Math.ceil(Math.random()*5);
    }
    return value;
}

function localStorageTest2() {
    for (var i = 0; i < 70000; i++) {
        window.localStorage.setItem("1", getRandomValue(20000));
    }
}

铬:

代码语言:javascript
复制
localStorageTest2();
<browser crashed>

Firefox:

代码语言:javascript
复制
localStorageTest2();
<browser crashed>

测试localStorage2也会导致浏览器崩溃。

EN

回答 1

Stack Overflow用户

发布于 2014-03-29 16:44:07

我不知道为什么浏览器会崩溃,但值得在crbug.combugzilla.mozilla.com上报告。

然而,localStorage并不适合这种使用。它是一个同步API,当它被使用时,会给浏览器带来很大的压力,特别是当它被如此频繁地使用时,通常会导致页面表现不好。

而且,您的测试不会产生正确的结果--当您超过限制时,setItem(x, y)会抛出一个异常。localStorage.setItem(x, y); if (y == localStorage.getItem(x)) { ... }永远不会到达if部件,因为当达到极限时,它会提前抛出异常。

替代方案是简单变量、服务器存储或IndexedDB。

Chrome还有FileSystem API和,但最好不要依赖这些API,因为其他浏览器不支持它们。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21705832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档