關於內存屏蔽 和內存泄漏的解決

第一:程序在運行時內存實際的訪問順序和程序代碼編寫的訪問順序不必定一致,這就是內存亂序訪問。內存亂序訪問行爲出現的理由是爲了提高程序運行時的性能。內存亂序訪問主要發生在兩個階段:html

  1. 編譯時,編譯器優化致使內存亂序訪問(指令重排)
  2. 運行時,多 CPU 間交互引發內存亂序訪問

Memory barrier 可以讓 CPU 或編譯器在內存訪問上有序。一個 Memory barrier 以前的內存訪問操做一定先於其以後的完成。Memory barrier 包括兩類:java

  1. 編譯器 barrier
  2. CPU Memory barrier
第二:內存泄漏也稱做「存儲滲漏」,用動態存儲分配函數動態開闢的空間,在使用完畢後未釋放,結果致使一直佔據該內存單元。直到程序結束。(其實說白了就是該內存空間使用完畢以後未回收)即所謂內存泄漏。
內存泄漏形象的比喻是「操做系統可提供給全部進程的存儲空間正在被某個進程榨乾」,最終結果是程序運行時間越長,佔用存儲空間愈來愈多,最終用盡所有存儲空間,整個系統崩潰。因此「內存泄漏」是從操做系統的角度來看的。這裏的存儲空間並非指物理內存,而是指虛擬內存大小,這個虛擬內存大小取決於磁盤交換區設定的大小。由程序申請的一塊內存,若是沒有任何一個指針指向它,那麼這塊內存就泄漏了。

第三:IE中的內存泄漏有好幾種,這裏有詳細的解釋(http://msdn.microsoft.com/en-us/library/bb250448.aspx),園子裏也有翻譯了(http://www.cnblogs.com/birdshome/archive/2006/05/28/ie_memoryleak.html)。node

這裏只討論其中一種,即循環引用所形成的內存泄漏,由於,這是一種最廣泛的狀況。函數

第四:當在DOM元素或一個ActiveX對象與普通JavaScript對象之間存在循環引用時,IE在釋放這類變量時存在特殊的困難,最好手動切斷循環引用,這個bug在IE 7中已經被修復了(http://www.quirksmode.org/blog/archives/2006/04/ie_7_and_javasc.html)。性能

「IE 6 suffered from memory leaks when a circular reference between several objects, among which at least one DOM node, was created. This problem has been solved in IE 7. 」優化

相關文章
相關標籤/搜索