回答
内存分配是要求系统使用某些内存来执行某些操作的行为。
垃圾收集是一个过程,以检查是否以前分配的一些内存不再是真正使用(即无法再访问从程序)来自动释放它。
一个微妙的一点是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. 取消分配C++风格的内存或垃圾收集器有什么区别?
- 4. 垃圾回收闪存
- 5. Chrome的内存/垃圾收集问题
- 6. 垃圾回收问题
- 7. 垃圾回收 - 期待什么?
- 8. Mac OS中垃圾收集和引用计数有什么区别
- 9. 垃圾回收和cgo
- 10. Spidermonkey和垃圾回收
- 11. Objective-c和垃圾回收
- 12. HashMap.remove和垃圾回收
- 13. 循环和垃圾回收
- 14. Malloc和新运算符分配内存有什么区别?
- 15. 垃圾收集器如何释放AsyncTask分配的内存
- 16. 垃圾回收器回收值类型的内存
- 17. JDBC垃圾回收
- 18. Java:垃圾回收
- 19. C#垃圾回收
- 20. Java:垃圾回收
- 21. Erlang垃圾回收
- 22. java垃圾回收
- 23. Python垃圾回收
- 24. JS垃圾回收
- 25. Javascript垃圾回收
- 26. PhoneGap垃圾回收
- 27. java - 垃圾回收
- 28. Java内存区域和垃圾收集器
- 29. AEM中的数据存储垃圾收集和java垃圾收集之间的区别
- 30. ()和[]动态分配有什么区别?
可能的重复[学习垃圾收集理论](http://stackoverflow.com/questions/1318631/learning-garbage-collection-theory) – 2012-02-07 20:18:31
这与囤积和转储运行之间的区别是一样的。 – Paul 2012-02-07 20:19:45