不可訪問記憶體

不可訪問記憶體是指一組沒有任何可訪問指針指向的由電腦程式進行動態分配的記憶體塊。

基本介紹

  • 中文名:不可訪問記憶體
  • 領域:計算機
簡介,記憶體泄漏,記憶體管理,

簡介

類似的,一個不可訪問對象是指沒有可訪問引用型指向的動態分配對象。通俗來說,不可訪問記憶體是程式無法直接訪問的動態記憶體,同時也無法通過指針指向一個可訪問的起始對象來進行訪問。
動態記憶體分配的實現是採用了垃圾回收機制,在一個對象不可訪問後,它會被回收。垃圾收集器能決定是否一個對象還是可訪問的;任何被確定不可訪問的對象將會被釋放。在許多程式語言中(例如:JavaC#D語言Dylan)都使用了自動垃圾回收機制。
相反的,在動態記憶體分配機制中,當需要明確釋放的記憶體變得不可訪問時,此記憶體可以不再明確釋放。在使用人工記憶體管理中,系統中的不可訪問記憶體會導致記憶體泄漏
一些垃圾收集器使用弱引用。如果一個對象能夠通過弱引用或者包含弱引用的連結,那么這個對象可以被稱為弱訪問。垃圾收集器能夠把弱訪問的對象圖視為不可訪問的,並且釋放它。(反過來說,防止對象被當作垃圾收集的引用被稱為強引用;通過只含有強引用的連結來訪問的弱可訪問對象是不可訪問的。)一些垃圾回收的面向對象語言,例如JavaPython,擁有弱引用的特性。Java包java.lang.ref提供了軟引用,弱引用和虛引用,產生了其他對象訪問狀態可軟訪問可虛訪問
不可訪問記憶體往往和軟體老化有關。

記憶體泄漏

計算機科學中,記憶體泄漏指由於疏忽或錯誤造成程式未能釋放已經不再使用的記憶體。記憶體泄漏並非指記憶體在物理上的消失,而是應用程式分配某段記憶體後,由於設計錯誤,導致在釋放該段記憶體之前就失去了對該段記憶體的控制,從而造成了記憶體的浪費。
記憶體泄漏通常情況下只能由獲得程式原始碼的程式設計師才能分析出來。然而,有不少人習慣於把任何不需要的記憶體使用的增加描述為記憶體泄漏,即使嚴格意義上來說這是不準確的。
記憶體泄漏會因為減少可用記憶體的數量從而降低計算機的性能。最終,在最糟糕的情況下,過多的可用記憶體被分配掉導致全部或部分設備停止正常工作,或者應用程式崩潰。
記憶體泄漏帶來的後果可能是不嚴重的,有時甚至能夠被常規的手段檢測出來。在現代作業系統中,一個應用程式使用的常規記憶體在程式終止時被釋放。這表示一個短暫運行的應用程式中的記憶體泄漏不會導致嚴重後果。
在以下情況,記憶體泄漏導致較嚴重的後果:
  • 程式運行後置之不理,並且隨著時間的流逝消耗越來越多的記憶體(比如伺服器上的後台任務,尤其是嵌入式系統中的後台任務,這些任務可能被運行後很多年內都置之不理);
  • 新的記憶體被頻繁地分配,比如當顯示電腦遊戲或動畫視頻畫面時;
  • 程式能夠請求未被釋放的記憶體(比如共享記憶體),甚至是在程式終止的時候;
  • 泄漏在作業系統內部發生;
  • 泄漏在系統關鍵驅動中發生;
  • 記憶體非常有限,比如在嵌入式系統或便攜設備中;
  • 當運行於一個終止時記憶體並不自動釋放的作業系統(比如AmigaOS)之上,而且一旦丟失只能通過重啟來恢復。

記憶體管理

記憶體管理,是指軟體運行時對計算機記憶體資源的分配和使用的技術。其最主要的目的是如何高效,快速的分配,並且在適當的時候釋放和回收記憶體資源。
一個運行中的程式,譬如網頁瀏覽器在個人電腦或是圖靈機(Turing machine)裡面,為一個進程將數據轉換於真實世界及電腦存儲器之間,然後將數據存於電腦存儲器內部(在計算機科學,一個程式是一群指令的集合,一個進程是電腦在運行中的程式)。存儲器能被實際組織在許多方法裡頭,例如磁帶或是磁碟,或是小數組容量的微晶片。 從1950年代開始,計算機變的更複雜,它被連線於許多種類的存儲器。記憶體管理的任務也變得複雜,甚至必須要在同一台機器上相同的時間運行多個進程
在存儲器內,一個程式(作業系統)在每一個數據區塊持續地追蹤實體位置,及移動實體上的數據去改善其性能及保證可靠性,對於每個用戶層(user-level)的程式,作業系統分配一段虛擬記憶體空間,當進程起始時,不需要移動數據到實體設備間,數據存於磁碟內的虛擬記憶體空間,也不需要去配置主存空間給該進程,當用戶有需要用到時,他們才會很自由地載入到主存內。
可以想像一個很大的程式,當他運行時變成進程,而大部分的存儲器空間都被存到磁碟內虛擬記憶體地址,需要用到的部分才被載入到存儲器內部提供服務。

相關詞條

熱門詞條

聯絡我們