几行代码瞬间卡死电脑
来源:互联网 发布:软件开发详细设计算法 编辑:程序博客网 时间: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的内存就会全部被分配出去。一般来说电脑会马上卡死。但是现在电脑有内存保护机制。所以,只要你能结束浏览器的的进程,那些被分配出去的内存也就会被释放。
但是,手机的内存保护机制与电脑有些不同。苹果的手机在内存被分配完后,为了防止内存溢出,一般会马上自动关机重启。安卓的手机则会释放出导致内存溢出的进程空间,所以安卓的手机一帮会浏览器闪退。这就是上面链接的基本原理。
- 几行代码瞬间卡死电脑
- TSVNCache.exe卡死电脑的解决方法
- 瞬间解除电脑开机密码
- MyEclipse 代码编写,编译卡死,启动卡死解决方案
- MyEclipse 代码编写,编译卡死,启动卡死解决方案
- 电脑上演慢动作 解答系统卡死之谜
- 你因为电脑卡死重装过系统吗?
- MyEclipse代码提示卡死优化
- 代码优化--死代码
- 解决ECLIPSE 卡死的几种方法
- 瞬间
- 瞬间
- 电脑检查卡常见代码
- 几行代码而已
- 几行C++代码
- 几行py代码
- 关于“几行代码”
- Primo Ramdisk – 瞬间提高电脑速度(内存虚拟硬盘)
- 第一个Servlet程序
- makefile中 := 和= 有啥区别
- 线程
- 如何找到区间数组的最大和?最大积?
- 指针与数组
- 几行代码瞬间卡死电脑
- Log4j 学习笔记(三)log4j.properties实例讲解
- jquery 中 事件绑定函数 bind() ,live(),delegate()以及on() 的区别
- 线程安全问题
- 旧版本的xcode真机调试新的iOS系统
- Android学习资源
- 利用dialogArguments进行网页页面传值
- [读书笔记] 深入探索C++对象模型-第七章-站在对象模型的尖端(中)
- Makefile 中:= ?= += =的区别