几行代码瞬间卡死电脑

来源:互联网 发布:软件开发详细设计算法 编辑:程序博客网 时间:2024/04/29 13:51

前几天有人给我发了链接,一段换汤不换药的链接。我看了里面的代码,是前段时间呢传入国内的一段js代码。代码会使电脑浏览器卡死,内存飙升,苹果手机重启,安卓浏览器闪退。在此做下细致的解释:

代码如下:

<html><body><script>var total = " ";for (var i = 0; i < 100000; i++){    total = total + i.toString();    history.pushState(0,0,total);}</script></body></html>

这12行代码没有正常html语法中的基本元素,只有4行脚本代码,但是这4行代码执行完基本就没有什么机会执行其他元素了。先来回想上篇文章中进程空间的概念:http://blog.csdn.net/yuyushikuan/article/details/52850191上篇文章中很详细的讲述了进程空间的概念。这里直接使用这个概念。
当我们打开浏览器的时候,简单的想,就是运行了一个程序。也就形成了一个进程。那么cpu就要给这个进程分配进程空间。当然,实际上浏览器的运行可不止一个单单的进程,但总而言之。cpu会为这个进程分配一块比较大的进程空间。

那么现在来看看这几行代码干了什么:
首先,定义了一个变量并赋值一个空字符串。下面执行了100000次的循环,我们来看看每一次的循环都干了什么。循环里的两行代码

    total = total + i.toString();    history.pushState(0,0,total);

第一行中toString()将i转化成了string类型,这样就能和total合并成一个新的字符串并重新赋值给total。
第二行中 history.pushState(data, title, url):往历史记录堆栈顶部添加一条记录;data会在onpopstate事件触发时作为参数传递过去;title为页面标题,当前所有浏览器一般都会 忽略此参数;URL为页面地址,可选,缺省为当前页地址。
上面比较官方的话比较直白的说明一下就是,这个循环又打开了一个页面,而重新打开的页面的url并没有什么具体意义。只是向cpu申请了一片进程空间。我们上面提到过,打开浏览器需要的进程空间是比较大的。别忘了,这只是一次循环的后果,上面一共100 000次的循环,也就是脚本在指挥浏览器不断地向cpu申请进程空间。我们电脑4G的运行内存,并且cpu的内存分配器存在“立即响应机制”。所以只要不断申请,可以说瞬间,cpu的内存就会全部被分配出去。一般来说电脑会马上卡死。但是现在电脑有内存保护机制。所以,只要你能结束浏览器的的进程,那些被分配出去的内存也就会被释放。
但是,手机的内存保护机制与电脑有些不同。苹果的手机在内存被分配完后,为了防止内存溢出,一般会马上自动关机重启。安卓的手机则会释放出导致内存溢出的进程空间,所以安卓的手机一帮会浏览器闪退。这就是上面链接的基本原理。

1 0
原创粉丝点击