首页 » 技术分享 » 浏览器“假死”原因

浏览器“假死”原因

 

浏览器”假死“原因

 

浏览器”假死“原因比较多,大致可以分为下面几种情况

1.死锁

如果浏览器内部存在2个以上线程锁或者互斥量,如果多个锁互相等待,则会出现死锁,后果很严重,可能导致系统不能响应鼠标和按键的消息。这种情况较少见。

2.执行Javascript脚本

如果Javascript脚本存在深层次递归或者大量的循环,由于Javascript会重用大量的CPU时间,在用户看来可能会长时间不能响应输入事件,不过一般的Javascript引擎都存在脚本执行超时检测,如果脚本执行时间较长(如超过10秒)就会提示是否中止该脚本的执行,如Firefox和Safari等都有该功能;

利用Javascript弹出alert等模态对话框,导致用户无法响应其他页面的浏览,这主要是由于浏览器内部是单进程单线程模型(整个浏览器实例只有一个进程和主线程),模态对话框会组塞消息循环,从而导致其他页面无法浏览或者切换。

3.DOM操作

由于DOM树的修改会影响到网页内容的排版和重绘,一般的排版算法都存在递归(分析CSS2.1即可看出来),如果操作不当或者浏览器内核不是足够健壮,则会引起网页不断排版,重绘,重绘又导致排版的死循环,现象就是CPU占用过高。

4.插件阻塞了消息循环

对于插件实例运行在浏览器内核的主线程这种框架下,这样插件实例公用了浏览器的消息队列,如果插件侧阻塞了消息循环,则会阻塞整个UI,从而导致”假死“。

5.不安全的ActivexObject

原因和4类似

6.同步的IO请求

socket采用了阻塞IO,那么客户端(浏览器)在建立HTTP链接时,会出现阻塞,导致用户操作无法响应。

7.同步的DNS解析

如果采用同步DNS解析(如调用gethostbyname),则在DNS解析过程中会出现阻塞,导致用户操作无法响应。

8.同步的document.load

这种情况没有来的及验证,呵呵!

转载自原文链接, 如需删除请联系管理员。

原文链接:浏览器“假死”原因,转载请注明来源!

0