簡介
類似的,一個
不可訪問對象是指沒有可訪問引用型指向的動態分配
對象。通俗來說,不可訪問記憶體是程式無法直接訪問的動態記憶體,同時也無法通過指針指向一個可訪問的起始對象來進行訪問。
動態記憶體分配的實現是採用了
垃圾回收機制,在一個對象不可訪問後,它會被回收。垃圾收集器能決定是否一個對象還是可訪問的;任何被確定不可訪問的對象將會被釋放。在許多
程式語言中(例如:
Java,
C#,
D語言,
Dylan)都使用了自動垃圾回收機制。
相反的,在動態記憶體分配機制中,當需要明確釋放的記憶體變得不可訪問時,此記憶體可以不再明確釋放。在使用人工
記憶體管理中,系統中的不可訪問記憶體會導致
記憶體泄漏。
一些垃圾收集器使用
弱引用。如果一個對象能夠通過弱引用或者包含弱引用的連結,那么這個對象可以被稱為
弱訪問。垃圾收集器能夠把弱訪問的對象圖視為不可訪問的,並且釋放它。(反過來說,防止對象被當作垃圾收集的
引用被稱為
強引用;通過只含有強引用的連結來訪問的弱可訪問對象是不可訪問的。)一些垃圾回收的
面向對象語言,例如
Java和
Python,擁有弱引用的特性。
Java包java.lang.ref提供了軟引用,弱引用和虛引用,產生了其他對象訪問狀態
可軟訪問和
可虛訪問。
記憶體泄漏
在
計算機科學中,
記憶體泄漏指由於疏忽或錯誤造成程式未能釋放已經不再使用的
記憶體。記憶體泄漏並非指記憶體在物理上的消失,而是應用程式分配某段記憶體後,由於設計錯誤,導致在釋放該段記憶體之前就失去了對該段記憶體的控制,從而造成了記憶體的浪費。
記憶體泄漏通常情況下只能由獲得程式
原始碼的程式設計師才能分析出來。然而,有不少人習慣於把任何不需要的記憶體使用的增加描述為記憶體泄漏,即使嚴格意義上來說這是不準確的。
記憶體泄漏會因為減少可用記憶體的數量從而降低計算機的性能。最終,在最糟糕的情況下,過多的可用記憶體被分配掉導致全部或部分設備停止正常工作,或者應用程式崩潰。
記憶體泄漏帶來的後果可能是不嚴重的,有時甚至能夠被常規的手段檢測出來。在現代作業系統中,一個應用程式使用的常規記憶體在程式終止時被釋放。這表示一個短暫運行的應用程式中的記憶體泄漏不會導致嚴重後果。
在以下情況,記憶體泄漏導致較嚴重的後果:
記憶體管理
記憶體管理,是指
軟體運行時對計算機
記憶體資源的分配和使用的技術。其最主要的目的是如何高效,快速的分配,並且在適當的時候釋放和回收記憶體資源。
一個運行中的程式,譬如網頁瀏覽器在個人電腦或是
圖靈機(Turing machine)裡面,為一個
進程將數據轉換於真實世界及電腦存儲器之間,然後將數據存於電腦存儲器內部(在計算機科學,一個
程式是一群指令的集合,一個
進程是電腦在運行中的程式)。存儲器能被實際組織在許多方法裡頭,例如磁帶或是磁碟,或是小數組容量的微晶片。 從1950年代開始,計算機變的更複雜,它被連線於許多種類的存儲器。記憶體管理的任務也變得複雜,甚至必須要在同一台機器上相同的時間運行多個
進程。
在存儲器內,一個程式(
作業系統)在每一個數據區塊持續地追蹤實體位置,及移動實體上的數據去改善其性能及保證可靠性,對於每個
用戶層(user-level)的程式,作業系統分配一段虛擬記憶體空間,當進程起始時,不需要移動數據到實體設備間,數據存於磁碟內的虛擬記憶體空間,也不需要去配置主存空間給該進程,當用戶有需要用到時,他們才會很自由地載入到主存內。
可以想像一個很大的程式,當他運行時變成進程,而大部分的存儲器空間都被存到磁碟內虛擬記憶體地址,需要用到的部分才被載入到存儲器內部提供服務。