2012-02-07 70 views
1

我明白'垃圾收集'是一種內存管理的形式,它是一種自動回收未使用的內存的方式。請問內存分配和垃圾回收有什麼區別?

但是'內存分配'和'垃圾收集'的概念區別是什麼?

+0

可能的重複[學習垃圾收集理論](http://stackoverflow.com/questions/1318631/learning-garbage-collection-theory) – 2012-02-07 20:18:31

+2

這與囤積和轉儲運行之間的區別是一樣的。 – Paul 2012-02-07 20:19:45

回答

3

內存分配是要求系統使用某些內存來執行某些操作的行爲。

垃圾收集是一個過程,以檢查是否以前分配的一些內存不再是真正使用(即無法再訪問從程序)來自動釋放它。

一個微妙的一點是the objective of garbage collection is not actually "freeing objects that are no longer used", but to emulate a machine with infinite memory,讓你繼續分配內存,而不是關心重新分配它;因此,它不能替代其他類資源的管理(例如文件句柄,數據庫連接等)。

6

他們南轅北轍。所以是的,差別很大。

分配內存是要求內存空間來存儲事物的過程。

垃圾收集(或釋放內存)是將內存釋放回可用內存池的過程。

許多新的語言執行這兩個在後臺這些步驟你當變量聲明/初始化,並且掉出的範圍。

1

一個簡單的僞代碼示例:

void myFoo() 
{  
    LinkedList<int> myList = new LinkedList<int>(); 
    return; 
} 

這將在堆上要求足夠的新的空間來存儲鏈表對象。 但是,當函數體結束時,myList消失,並且無論如何不知道該LinkedList存儲在哪裏(內存地址)。因此,絕對沒有辦法告訴系統釋放該內存,並稍後再提供給您。

Java垃圾收集器會自動爲你做的,在一些性能爲代價,並與還推出了一點點不確定性(你真的不能告訴時,GC會被調用)。

C++沒有提供原生垃圾收集器(沒有?)。但是管理存儲器的正確的方法是通過使用smart_pointers的(例如std::auto_ptr(在C++ 11不建議使用),std::shared_ptr)等等等等

+1

即使在較早的C++標準中,實際上也可以運行垃圾收集器,但是您可能會遇到問題(也因爲語言的本質,它必須是悲觀的GC - 比我們今天在Java中的要糟糕得多)。他們爲GC添加了一些可選的東西給C++ 11,但是這種語言並沒有把自己交給GC。 – Voo 2012-02-07 20:45:30

+0

@Voo,yeap。這就是我的意思是「(但?)」。我記得在閱讀C++ 11時看到有關GC的一些信息,但我不確定發生了什麼。感謝您清除這個。 – Muggen 2012-02-07 20:52:03

0

內存分配請求計算機,某些存儲器,以存儲數據。例如,在C++中:

int* myInts = new int[howManyIntsIWant]; 

告訴計算機分配足夠的內存來存儲一些整數。

做同樣的事情的另一種方法是:

int myInts[6]; 

這裏的區別是,在第二個例子中,我們知道,當代碼編寫和編譯,我們究竟需要多大的空間 - 這是6 *一個int的大小。這讓我們可以進行靜態內存分配(在所謂的「堆棧」上使用內存)。

在第一個例子中,我們不知道代碼編譯時需要多少空間,我們只知道它在程序運行時的位置,我們知道howManyIntsIWant的值。這是動態內存分配,它在「堆」上獲取內存。

現在,通過靜態分配,我們不需要告訴計算機何時完成內存。這涉及堆棧的工作原理;簡短的版本是,一旦我們離開了創建靜態數組的地方,內存就被直接吞噬了。

通過動態分配,這不會發生,所以內存必須以其他方式清理。在某些語言中,您必須編寫代碼來釋放此內存,而在其他語言中則會自動完成。這是垃圾回收 - 一種內置於語言中的自動處理,它將掃過堆中所有動態分配的內存,計算出哪些位未被使用並釋放它們(即釋放它們用於其他進程和程序)。

因此:內存分配=爲您的程序請求內存。垃圾收集=程序設計語言本身的作用是什麼內存不再被使用,併爲你解除分配。

1

你想要一本書。你去圖書館請求你想要的書。圖書館檢查他們是否擁有這本書(在這種情況下他們是這樣做的),並且你很樂意接受它,並知道你必須稍後再回來。

你回家,坐下來,讀完並完成它。你第二天將圖書歸還給圖書館,因爲你已經完成了。

這是一個簡單的內存分配和垃圾回收的比喻。計算機的內存有限,就像圖書館有限的書本一樣。當你想分配內存時,你需要提出請求,如果計算機有足夠的內存(庫有足夠的副本),那麼你收到的是一塊內存。計算機需要內存來存儲數據。

由於計算機內存有限,所以您需要返回內存,否則您將用完(就像沒有人將書籍返回到庫中,那麼庫不會有任何內容,計算機將在您非常之前爆炸並且劇烈燃燒眼睛,如果它用完了內存... 不是真的)。垃圾收集是檢查先前分配的內存是否不再使用的術語,因此可以將其返回並用於其他目的。