• <source id="scois"></source>
    您的位置:首頁 > 編程學習 > 其它 > 正文

    網站讓瀏覽器崩潰的原因

    更多 時間:2014-4-12 類別:編程學習 瀏覽量:761

    網站讓瀏覽器崩潰的原因

    網站讓瀏覽器崩潰的原因

    一、 內存泄漏

    網站由于內存泄漏的而照成崩潰有兩種情況,服務器的崩潰和瀏覽器的崩潰。內存泄漏所造成的問題是顯而易見的,它使得已分配的內存的引用就會丟失,只要系統還在運行中,則進程就會一直使用該內存。這樣的結果是,曾占用更多的內存的程序會降低系統性能,直到機器完全停止工作,才會完全清空內存。

    1、網站的程序代碼編寫不規范

    引起的內存泄漏問題不必多說,系統中存在無法回收的內存,有時候會造成內存不足或系統崩潰。

    2、在客戶端,JavaScript所造成的內存泄漏,也將可能使得瀏覽器崩潰

    JavaScript 是一種垃圾收集式(GC)語言,這就是說,內存是根據對象的創建分配給該對象的,并會在沒有對該對象的引用時由瀏覽器收回。瀏覽器處理JavaScript并非采用純粹的垃圾收集,還使用引用計數來為Native對象(例如 Dom、ActiveX Object)處理內存。在引用計數系統,每個所引用的對象都會保留一個計數,以獲悉有多少對象正在引用它。如果計數為零,該對象就會被銷毀,其占用的內存也會返回給堆。
     

    簡單來說就是,瀏覽器使用引用計數來為Native對象處理內存,而引用計數的對象無法被銷毀,涉及Native對象的循環引用將會出現內存泄漏。

    實例1:

  •  
  • JScript 代碼   復制
  • 
    var obj;
    window.onload =
    function(){
    // JavaScript對象obj到DOM對象的引用,根據id獲得
    obj=document.getElementById("liElement");
    // DOM 對象則有到此 JavaScript 對象的引用,由expandoProperty實現
    document.getElementById("liElement").expandoProperty=obj;
    }
    			
  • 上面實例:JavaScript 對象和 DOM 對象間就產生了一個循環引用。由于 DOM 對象是通過引用計數管理的,所以兩個對象將都不能銷毀。
    1 F% G$ p' p5 b$ R

    實例2:

    閉包中,當碰到閉包,我們在Native對象上綁定事件響應代碼時,很容易制造出Closure Memory Leak。其關鍵原因和前者是一樣的,也是一個跨JavaScript對象和Native對象的循環引用。只是代碼更為隱蔽。

  •  
  • JScript 代碼   復制
  • 
    window.onload =
    function AttachEvents(element)
    {
    //element有個引用指向函數ClickEventHandler()     
      element.attachEvent(" onclick" , ClickEventHandler);
    function ClickEventHandler()
    {
    //該函數有個引用指向AttachEvents(element用Scope,
    //也就是執行了參數element。
    }
    }
    		
  • 內存泄漏加大瀏覽器的負擔,很有可能導致瀏覽器崩潰,我們要做的就是盡量去避免這種情況,處理JavaScript內存泄漏最終目的還是要打破JavaScript對象和Native對象間的循環引用或者清零引用計數,釋放對象。

    二. 網頁數據過多

    網頁含有大量需要處理的數據,造成系統繁忙,如多圖頁面,超長頁面等,或者網頁內嵌的各種控件會導致瀏覽器處理大量數據,造成系統繁忙。如Flash游戲,ActiveX控件等。當瀏覽器訪問網站的時候,如果網站的數據量大,會使得瀏覽器一般在處理過程中會占用很大的CPU使用率和內存、造成瀏覽器失去響應,甚至會使電腦系統死機。在網站開發的時候,如果充分考慮Web性能,很大程度上能避免這個問題。

    三、Ajax的Web服務漏洞

    Ajax的是基于XML的異步傳輸,文本格式的XML消息可能是二進制數據帶寬量的兩倍之多。傳輸XML消息所需的帶寬越多,系統或應用程序用來執行其他任務的可用資源就越少。例如執行復雜算法來獲取期望結果。

    過高的帶寬可能導致由系統超載引起的性能減退。過高的帶寬將導致Ajax應用程序輸出破損的數據,因為沒有足夠的資源生成干凈的數據。這意味著Web服務門戶(Ajax應用程序屬于其中的一部分)將把破損數據暴露給門戶的其他部分,從而導致畸形消息和過度解析。如果威脅者利用了這個漏洞,則會引起瀏覽器崩潰。

    另外一方面,頻繁的、較小的 HTTP 請求會加重后端服務器、負載均衡程序和防火墻的負擔,結果是造成過高的帶寬,最終導致性能降低。如果客戶端長期停留在該頁面或沒有關閉瀏覽器,會使得瀏覽器的內存持續上漲,得不到釋放,導致客戶端瀏覽器崩潰。

    為此,在較多的時候Ajax的時候,我們要考慮通過專門的硬件加速器、優化軟件、消除代碼冗余、XML加速功能和解決互操作性問題等方式加速Ajax應用程序。另外,積極地監視通信流可以持續地度量Ajax應用程序的網絡流量性能。通過將數據放入實時日志中,您可以查看在哪些位置何時出現大量的包丟失和抖動事件,響應變慢的原因以及如何通過修改應用程序的優先級來改善通信流性能。

    四、其他原因

    除以上提到的原因之外,還有其他許多原因,雖然有些不會導致瀏覽器直接崩潰,但也會造成網站無法訪問,如日志文件導致磁盤已滿、Web服務器C指針錯誤、進程缺乏文件描述符、線程死鎖、數據庫中的臨時表不夠用和服務器超載等

    五、總結

    我們從事網站開發維護的時候,我們應該盡量去避免內存泄漏、代碼錯誤和冗余及數據量過大等問題,構建更佳性能的站點。
    ! Y! p' u5 h( c2 u

    標簽:瀏覽器崩潰
    超碰狠狠干人人干
  • <source id="scois"></source>