- 时间:2021-11-08 13:31 编辑: 来源: 阅读:
- 扫一扫,手机访问
摘要:网站导致浏览器崩溃的原因总结(多款浏览器) 推荐
面试某公司的时候,面试官问到,导致浏览器崩溃的原因有哪些?愚辈不才,仅回答出了内存泄漏。其实在网页在装载的过程中,常常由于种种原因使浏览器的反映变的很慢,或造成浏览器失去响应,甚至会导致机器无法进行其他的操作。
对于访客,如果登录您网站,浏览器就立刻崩溃,我想这对谁都是无法容忍的,对此总结了网站导致浏览器崩溃的原因:
[i]1[/i]. 内存泄漏
还是先谈下内存泄漏,网站由于内存泄漏的而照成崩溃有两种情况,服务器的崩溃和浏览器的崩溃。内存泄漏所造成的问题是显而易见的,它使得已分配的内存的引用就会丢失,只要系统还在运行中,则进程就会一直使用该内存。这样的结果是,曾占用更多的内存的程序会降低系统性能,直到机器完全停止工作,才会完全清空内存。
Apache的Web服务器是用C/C++编写的,C/C++的内存泄漏问题不必多说,系统中存在无法回收的内存,有时候会造成内存不足或系统崩溃。在Java中,内存泄漏就是存在一些被分配的可达而无用的对象,这些对象不会被GC所回收,然而它却占用内存。
而在客户端,JavaScript所造成的内存泄漏,也将可能使得浏览器崩溃。关于JavaScript的内存泄漏的文章,较权威的有《[url=http://www.ibm.com/developerworks/web/library/wa-memleak/?S_TACT=105AGX52&S_CMP=cn-a-wa]Memory leak patterns in JavaScript[/url]》和《[url=http://msdn2.microsoft.com/en-us/library/bb250448.aspx]Understanding and Solving Internet Explorer Leak Patterns[/url]》。
JavaScript 是一种垃圾收集式(garbage collector,GC)语言,这就是说,内存是根据对象的创建分配给该对象的,并会在没有对该对象的引用时由浏览器收回。再根据《[url=http://blogs.msdn.com/ericlippert/archive/2003/09/17/53038.aspx]Fabulous Adventures In Coding[/url]》一文的说法:“JScript uses a nongenerational mark-and-sweep garbage collector.”,对” nongenerational mark-and-sweep”的可以这样理解,浏览器处理JavaScript并非采用纯粹的垃圾收集,还使用引用计数来为Native对象(例如Dom、ActiveX Object)处理内存。
在引用计数系统,每个所引用的对象都会保留一个计数,以获悉有多少对象正在引用它。如果计数为零,该对象就会被销毁,其占用的内存也会返回给堆。 当对象相互引用时,就构成循环引用,浏览器(IE6,Firefox2.0)对于纯粹的JavaScript对象间的循环引用是可以正确处理的,但由于在引用计数系统,相互引用的对象都不能被销毁,因为是引用计数永远不能为零,因此浏览器无法处理JavaScript与Native对象(例如Dom、ActiveX Object)之间循环引用。所以,当我们出现Native对象与JavaScript对象间的循环引用时,就会出现内存泄漏的问题。
简单来说就是,浏览器使用引用计数来为Native对象处理内存,而引用计数的对象无法被销毁,涉及Native对象的循环引用将会出现内存泄漏。配合下面的例子,理解这句话,基本上就可以理解JavaScript造成的内存泄漏了。
[url=http://www.ibm.com/developerworks/web/library/wa-memleak/?S_TACT=105AGX52&S_CMP=cn-a-wa]Memory leak patterns in JavaScript[/url]》和《[url=http://msdn2.microsoft.com/en-us/library/bb250448.aspx]Understanding and Solving Internet Explorer Leak Patterns[/url]》两篇文章加以理解。处理JavaScript内存泄漏最终目的还是要打破JavaScript对象和Native对象间的循环引用或者清零引用计数,释放对象。
一些内存泄漏如闭包内存泄漏,我们可能比较难以发现,内存泄漏的检测我们可能参考《[url=http://www.cnblogs.com/wiky/admin/javascript%20%E5%86%85%E5%AD%98%E6%B3%84%E9%9C%B2%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8]javascript 内存泄露工具使用[/url]》。
[i]2[/i]. 网页代码复杂和浏览器bug
大量个人网站和低质量网站代码的涌现造成对浏览标准的普遍不支持,如果正好碰上浏览器存在的一些bug,浏览器渲染引擎在处理这些网页代码的时候会出错,比如陷入死循环或直接崩溃等。
[b]HTML代码导致网站崩溃[/b]
这是HTML结构错误而导致IE6的崩溃,在<col width="100"/>前或后添加任何字符均会导致IE6 Crash。
[url=http://forum.standardmag.org/viewtopic.php?pid=14282#p14282]网站[/url],无论是使用XHTML或者HTML的什么版本,只要带了DOCTYPE声明,IE6就会立即崩溃,当不带DOCTYPE声明的时候就没有错误,原因可能跟文档类型声明有关。
[b]令IE6崩溃的CSS代码[/b]
该代码参考自网站[url=http://www.catswhocode.com/blog/6-html-and-javascript-codes-to-crash-ie6]Cats who Code[/url]。该Bug发现与2007年,据说是一名日本人发现的:
[url=]
解决方案:为 <a> 添加 zoom:1; 令其触发haslayout。
<style type="text/css">
a{position:relative;zoom:1;}
a:hover{float:left;}
</style>
[b]令IE7崩溃的CSS代码[/b]
此Bug来自[url=http://www.tommyfan.com/]偷米饭[/url],它只存在IE7中据估计是处理省略字的时候导致IE7崩溃。
[url=http://www.cnblogs.com/wiky/admin/Internet%20Explorer%20Sucks]Internet Explorer Sucks[/url],这个网站就是使用了一下代码,当你使用IE6访问的时候,浏览器将立刻崩溃。代码如下:
[url=http://www.cnblogs.com/wiky/admin/%E5%AF%BC%E8%87%B4Web%E7%AB%99%E7%82%B9%E5%B4%A9%E6%BA%83%E6%9C%80%E5%B8%B8%E8%A7%81%E7%9A%84%E4%B8%83%E5%A4%A7%E5%8E%9F%E5%9B%A0]导致Web站点崩溃最常见的七大原因[/url]》。
总结
对于访客,如果登录您网站,浏览器就立刻崩溃,我想这对谁都是无法容忍的,通过总结《[url=http://www.cnblogs.com/wiky/archive/2010/01/16/website-makes-browser-crash-reasons.html]网站令浏览器崩溃的原因[/url]》,在我们从事网站开发维护的时候,我们应该尽量去避免内存泄漏、代码错误和冗余及数据量过大等问题,构建更佳性能的站点。
PS:本文由[url=http://wiky.cnblogs.com/]维奇[/url]总结,如有转载请注明出处
微信版

扫一扫进微信版
返回顶部