回答
內存分配是要求系統使用某些內存來執行某些操作的行爲。
垃圾收集是一個過程,以檢查是否以前分配的一些內存不再是真正使用(即無法再訪問從程序)來自動釋放它。
一個微妙的一點是the objective of garbage collection is not actually "freeing objects that are no longer used", but to emulate a machine with infinite memory,讓你繼續分配內存,而不是關心重新分配它;因此,它不能替代其他類資源的管理(例如文件句柄,數據庫連接等)。
他們南轅北轍。所以是的,差別很大。
分配內存是要求內存空間來存儲事物的過程。
垃圾收集(或釋放內存)是將內存釋放回可用內存池的過程。
許多新的語言執行這兩個在後臺這些步驟你當變量聲明/初始化,並且掉出的範圍。
一個簡單的僞代碼示例:
void myFoo()
{
LinkedList<int> myList = new LinkedList<int>();
return;
}
這將在堆上要求足夠的新的空間來存儲鏈表對象。 但是,當函數體結束時,myList
消失,並且無論如何不知道該LinkedList存儲在哪裏(內存地址)。因此,絕對沒有辦法告訴系統釋放該內存,並稍後再提供給您。
Java垃圾收集器會自動爲你做的,在一些性能爲代價,並與還推出了一點點不確定性(你真的不能告訴時,GC會被調用)。
在C++
沒有提供原生垃圾收集器(沒有?)。但是管理存儲器的正確的方法是通過使用smart_pointers的(例如std::auto_ptr
(在C++ 11不建議使用),std::shared_ptr
)等等等等
內存分配請求計算機,某些存儲器,以存儲數據。例如,在C++中:
int* myInts = new int[howManyIntsIWant];
告訴計算機分配足夠的內存來存儲一些整數。
做同樣的事情的另一種方法是:
int myInts[6];
這裏的區別是,在第二個例子中,我們知道,當代碼編寫和編譯,我們究竟需要多大的空間 - 這是6 *一個int的大小。這讓我們可以進行靜態內存分配(在所謂的「堆棧」上使用內存)。
在第一個例子中,我們不知道代碼編譯時需要多少空間,我們只知道它在程序運行時的位置,我們知道howManyIntsIWant的值。這是動態內存分配,它在「堆」上獲取內存。
現在,通過靜態分配,我們不需要告訴計算機何時完成內存。這涉及堆棧的工作原理;簡短的版本是,一旦我們離開了創建靜態數組的地方,內存就被直接吞噬了。
通過動態分配,這不會發生,所以內存必須以其他方式清理。在某些語言中,您必須編寫代碼來釋放此內存,而在其他語言中則會自動完成。這是垃圾回收 - 一種內置於語言中的自動處理,它將掃過堆中所有動態分配的內存,計算出哪些位未被使用並釋放它們(即釋放它們用於其他進程和程序)。
因此:內存分配=爲您的程序請求內存。垃圾收集=程序設計語言本身的作用是什麼內存不再被使用,併爲你解除分配。
你想要一本書。你去圖書館請求你想要的書。圖書館檢查他們是否擁有這本書(在這種情況下他們是這樣做的),並且你很樂意接受它,並知道你必須稍後再回來。
你回家,坐下來,讀完並完成它。你第二天將圖書歸還給圖書館,因爲你已經完成了。
這是一個簡單的內存分配和垃圾回收的比喻。計算機的內存有限,就像圖書館有限的書本一樣。當你想分配內存時,你需要提出請求,如果計算機有足夠的內存(庫有足夠的副本),那麼你收到的是一塊內存。計算機需要內存來存儲數據。
由於計算機內存有限,所以您需要返回內存,否則您將用完(就像沒有人將書籍返回到庫中,那麼庫不會有任何內容,計算機將在您非常之前爆炸並且劇烈燃燒眼睛,如果它用完了內存... 不是真的)。垃圾收集是檢查先前分配的內存是否不再使用的術語,因此可以將其返回並用於其他目的。
- 1. 分代和增量垃圾收集有什麼區別?
- 2. 垃圾回收+內存分頁
- 3. Parallel Copy垃圾回收器和Parallel Scavenge垃圾回收器的區別
- 4. 垃圾收集器和ARC之間有什麼區別?
- 5. 大內存塊沒有垃圾回收
- 6. 爲什麼內存塊沒有被垃圾回收器清除?
- 7. 取消分配C++風格的內存或垃圾收集器有什麼區別?
- 8. 內存競技場和內存分配器有什麼區別?
- 9. 字符串常量池內存扇區和垃圾回收
- 10. C++ Box2d內存管理/垃圾回收
- 11. 垃圾回收閃存
- 12. Chrome的內存/垃圾收集問題
- 13. 垃圾回收問題
- 14. ThreeJS垃圾回收問題
- 15. 垃圾回收 - 期待什麼?
- 16. 爲什麼禁用垃圾回收器?
- 17. 回收垃圾回收問題
- 18. Mac OS中垃圾收集和引用計數有什麼區別
- 19. 爲什麼內存位置分配了垃圾值?
- 20. JMX垃圾回收和System.gc()之間的區別?
- 21. Java內存泄漏和垃圾收集,
- 22. 垃圾收集有多少內存?
- 23. Spidermonkey和垃圾回收
- 24. c#和垃圾回收
- 25. 垃圾收集和回調
- 26. HBase MemStore和垃圾回收
- 27. Objective-c和垃圾回收
- 28. HashMap.remove和垃圾回收
- 29. 循環和垃圾回收
- 30. 垃圾回收和cgo
可能的重複[學習垃圾收集理論](http://stackoverflow.com/questions/1318631/learning-garbage-collection-theory) – 2012-02-07 20:18:31
這與囤積和轉儲運行之間的區別是一樣的。 – Paul 2012-02-07 20:19:45