为什么网站总出来崩溃的

为什么网站总出来崩溃的,第1张

面试某公司的时候,面试官问到,导致浏览器崩溃的原因有哪些?愚辈不才,仅回答出了内存泄漏。其实在网页在装载的过程中,常常由于种种原因使浏览器的反映变的很慢,或造成浏览器失去响应,甚至会导致机器无法进行其他的 *** 作。 对于访客,如果登录您网站,浏览器就立刻崩溃,我想这对谁都是无法容忍的,对此总结了网站导致浏览器崩溃的原因: 1 内存泄漏 还是先谈下内存泄漏,网站由于内存泄漏的而照成崩溃有两种情况,服务器的崩溃和浏览器的崩溃。内存泄漏所造成的问题是显而易见的,它使得已分配的内存的引用就会丢失,只要系统还在运行中,则进程就会一直使用该内存。这样的结果是,曾占用更多的内存的程序会降低系统性能,直到机器完全停止工作,才会完全清空内存。 Apache的Web服务器是用C/C++编写的,C/C++的内存泄漏问题不必多说,系统中存在无法回收的内存,有时候会造成内存不足或系统崩溃。在Java中,内存泄漏就是存在一些被分配的可达而无用的对象,这些对象不会被GC所回收,然而它却占用内存。 而在客户端,JavaScript所造成的内存泄漏,也将可能使得浏览器崩溃。关于JavaScript的内存泄漏的文章,较权威的有《Memory leak patterns in JavaScript》和《Understanding and Solving Internet Explorer Leak Patterns》。 JavaScript 是一种垃圾收集式(garbage collector,GC)语言,这就是说,内存是根据对象的创建分配给该对象的,并会在没有对该对象的引用时由浏览器收回。再根据《Fabulous Adventures In Coding》一文的说法:“JScript uses a nongenerational mark-and-sweep garbage collector”,对” nongenerational mark-and-sweep”的可以这样理解,浏览器处理JavaScript并非采用纯粹的垃圾收集,还使用引用计数来为Native对象(例如Dom、ActiveX Object)处理内存。 在引用计数系统,每个所引用的对象都会保留一个计数,以获悉有多少对象正在引用它。如果计数为零,该对象就会被销毁,其占用的内存也会返回给堆。 当对象相互引用时,就构成循环引用,浏览器(IE6,Firefox20)对于纯粹的JavaScript对象间的循环引用是可以正确处理的,但由于在引用计数系统,相互引用的对象都不能被销毁,因为是引用计数永远不能为零,因此浏览器无法处理JavaScript与Native对象(例如Dom、ActiveX Object)之间循环引用。所以,当我们出现Native对象与JavaScript对象间的循环引用时,就会出现内存泄漏的问题。 简单来说就是,浏览器使用引用计数来为Native对象处理内存,而引用计数的对象无法被销毁,涉及Native对象的循环引用将会出现内存泄漏。配合下面的例子,理解这句话,基本上就可以理解JavaScript造成的内存泄漏了。 var obj; windowonload = function(){ // JavaScript对象obj到DOM对象的引用,根据id获得 obj=documentgetElementById("DivElement"); // DOM 对象则有到此 JavaScript 对象的引用,由expandoProperty实现 documentgetElementById("DivElement")expandoProperty=obj; }; 可见,JavaScript 对象和 DOM 对象间就产生了一个循环引用。由于 DOM 对象是通过引用计数管理的,所以两个对象将都不能销毁。 另一种情况是闭包中,当碰到闭包,我们在Native对象上绑定事件响应代码时,很容易制造出Closure Memory Leak。其关键原因和前者是一样的,也是一个跨JavaScript对象和Native对象的循环引用。只是代码更为隐蔽。 windowonload = function AttachEvents(element){ //element有个引用指向函数ClickEventHandler() elementattachEvent( " onclick " , ClickEventHandler); function ClickEventHandler(){ //该函数有个引用指向AttachEvents(element)调用Scope, //也就是执行了参数element。 } } 这里简单理解了JavaScript造成内存泄漏的原因,内存泄漏加大浏览器的负担,很有可能导致浏览器崩溃,我们要做的就是尽量去避免这种情况,做法可参考刚刚所说《Memory leak patterns in JavaScript》和《Understanding and Solving Internet Explorer Leak Patterns》两篇文章加以理解。处理JavaScript内存泄漏最终目的还是要打破JavaScript对象和Native对象间的循环引用或者清零引用计数,释放对象。 一些内存泄漏如闭包内存泄漏,我们可能比较难以发现,内存泄漏的检测我们可能参考《javascript 内存泄露工具使用》。 2 网页代码复杂和浏览器bug 大量个人网站和低质量网站代码的涌现造成对浏览标准的普遍不支持,如果正好碰上浏览器存在的一些bug,浏览器渲染引擎在处理这些网页代码的时候会出错,比如陷入死循环或直接崩溃等。 HTML代码导致网站崩溃 这是HTML结构错误而导致IE6的崩溃,在<col width="100"/>前或后添加任何字符均会导致IE6 Crash。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 401 Transitional//EN"" >网站崩溃主要原因如下:
1网站本身开发程序的问题,比如代码死循,只想错误,一般本地调试好了,到服务器还要再做调试,尽量避免这样的事故发生;
2网站在服务器及空间的问题,如空间不足、数据库空间占用异常、服务器受攻击等诸多服务器原因;
网页打开慢的主要原因:
1网站开发程序优化不到位,或语言体系承载能力弱;
2网站自身数据量过大,网页读取技术不成熟,导致过慢;
3服务器的稳定性差;
4访问终端的网络速度限制;
5网站页面合成技术不成熟等;
异地打不开等的原因(这里我理解为异地太开前端展示效果的差异化):
1访问终端控件安装是否到位,有些网站在访问时要求安装相应的控件,才可完全展示效果;
2网站合成调试的不到为,没能适应不同分辨率、不同浏览器的需求所致。
多半就以上这些原因,若有不足还请补充。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10340509.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-07
下一篇 2023-05-07

发表评论

登录后才能评论

评论列表(0条)

保存