如果一个用户来访问你的网站,但是浏览器马上就崩溃了,这是用户所不能容忍的,也会给用户带来反感。所以在此,本人总结了一些导致浏览器崩溃的原因,希望对大家有所帮助。
1.内存泄漏
内存泄漏导致网站崩溃的情况有两种,一种是服务器的崩溃,另一种是浏览器的崩溃。内存泄漏的现象是显而易见的,其原因是操作系统提供给所有进程的存储空间被一个进程榨干了,最终结果是,进程运行的时间越长,占用的存储空间越大,最后用尽全部存储空间,导致整个系统崩溃,之后才会清空内存。
服务器: 对于C/C++的来说,系统中存在无法回收的内存,有时候会引起内存不足,更严重的则是系统崩溃。而对于java来说,系统中存在一些已分配内存但是没有被使用的对象,这些对象也不能被GC回收,一直占用着内存。
客户端:javascript的内存泄漏也有可能导致浏览器崩溃。javascript是一种垃圾回收式(garbage collector,简称GC)语言。这也就是说,内存是根据对象的创建而分配给对象的,并会在对象没有被引用的时候由浏览器回收。但是,javascript并非纯粹的垃圾回收式语言,浏览器还使用引用计数来为Native对象(如:DOM、Active Object)处理内存。在引用计数中,每个被引用的对象都会保留一个计数,这样就可以获悉当前有多少对象正在引用它。如果计数为零的对象就会被销毁,其内存也会被收回。当对象相互引用时,就构成了循环引用,由于存在相互引用系统,所以相互引用的对象无法被销毁(引用计数不为零)。浏览器无法处理javascript对象和Native对象的相互引用,所以当出现此情况的时候就会出现内存泄漏。通过下面的一个例子你就可以理解javadcript造成的内存泄漏问题。
window.onload = function(){
// JavaScript对象到DOM对象的引用
var obj=document.getElementById("DivElement");
// DOM 对象到JavaScript 对象的引用
document.getElementById("DivElement").expandoProperty=obj;
};
以上例子可以看出,javascript对象和DOM对象存在相互引用,这就构成了循环引用,而DOM对象是引用计数管理的,所以两个对象都不能被销毁。
另外一种情况则是出现在闭包中,当碰到闭包,我们在Native对象上绑定事件响应代码时,很容易制造出Closure Memory Leak。其关键原因和前者是一样的,也是一个跨JavaScript对象和Native对象的循环引用。只是代码更为隐蔽。
window.onload = function AttachEvents(element){
//element有个引用指向函数ClickEventHandler()
element.attachEvent( " onclick " , ClickEventHandler);
function ClickEventHandler(){
//该函数有个引用指向AttachEvents(element)
//也就是执行了参数element。
}
}
这里简单理解了JavaScript造成内存泄漏的原因,内存泄漏加大浏览器的负担,很有可能导致浏览器崩溃,我们要做的就是尽量去避免这种情况。处理JavaScript内存泄漏最终目的还是要打破JavaScript对象和Native对象间的循环引用或者清零引用计数,释放对象。
2. 网页代码不规范和浏览器bug
大量个人网站和低质量网站代码的涌现造成对浏览标准的普遍不支持,如果正好碰上浏览器存在的一些bug,浏览器渲染引擎在处理这些网页代码的时候会出错,比如陷入死循环或直接崩溃等。
HTML代码导致网站崩溃
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head></head>
<body>
<table>
<tr>
<td>
<table style="width:100%;table-layout:fixed;">
<colgroup><col width="100px"><col></colgroup>
</table>
</td>
</tr>
<table>
</body>
</html>
令IE6崩溃的CSS代码
<style>*{position:relative}</style>
<table><input></table>
原因在于table中直接放置内容,在IE6会引起mshtml.dll模块损坏而关闭浏览器,非IE6则安全无恙。
如果我们在IE中遇到浏览器崩溃的现象,我们可以尝试这个解决方案:为 标签添加 zoom:1; 令其触发haslayout。当然触发haslayout还有很多方法,具体的这里就不详细说明了。
3. 网页数据过多
网页含有大量需要处理的数据,造成系统繁忙,如多图页面,超长页面等,或者网页内嵌的各种控件会导致浏览器处理大量数据,造成系统繁忙。如Flash游戏,ActiveX控件等。当浏览器访问网站的时候,如果网站的数据量大,会使得浏览器一般在处理过程中会占用很大的CPU使用率和内存、造成浏览器失去响应,甚至会使电脑系统死机。在网站开发的时候,如果充分考虑Web性能,很大程度上能避免这个问题。
4. 其他原因
除以上提到的原因之外,还有其他许多原因,虽然有些不会导致浏览器直接崩溃,但也会造成网站无法访问,如日志文件导致磁盘已满、Web服务器C指针错误、进程缺乏文件描述符、线程死锁、数据库中的临时表不够用和服务器超载等
.
总结
对于访客,如果登录您网站,浏览器就立刻崩溃,我想这对谁都是无法容忍的,通过总结网站令浏览器崩溃的原因,在我们从事网站开发维护的时候,我们应该尽量去避免内存泄漏、代码错误和冗余及数据量过大等问题,构建更佳性能的站点。