请问内存分配和垃圾收集有什么区别?

时间:2012-02-07 20:14:45

标签: memory-management

我理解'垃圾收集'是一种内存管理形式,它是一种自动回收未使用内存的方法。

但是什么是'内存分配'以及与'垃圾收集'的概念差异?

5 个答案:

答案 0 :(得分:6)

他们是 Polar obposites 。所以是的,差别很大。

分配内存是声称存储空间的过程。

垃圾收集(或释放内存)是将内存释放回可用内存池的过程。

当声明/初始化变量并且超出范围时,许多较新的语言会在后台执行这两个步骤。

答案 1 :(得分:3)

内存分配是向系统请求一些内存以将其用于某事的行为。

垃圾收集是一个过程,用于检查以前分配的某些内存是否已不再使用(即无法再从程序访问)以自动释放它。

一个微妙的点是the objective of garbage collection is not actually "freeing objects that are no longer used", but to emulate a machine with infinite memory,允许你继续分配记忆而不关心解除分配;因此,它不能替代其他类型资源的管理(例如文件句柄,数据库连接......)。

答案 2 :(得分:1)

一个简单的伪代码示例:

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

这将在堆上请求足够的新空间来存储LinkedList对象。 但是,当函数体结束时,myList消失,并且您无论如何都知道存储此LinkedList的位置(内存地址)。因此,绝对没有办法告诉系统释放该内存,并在以后再次使用它。

Java垃圾收集器会自动为您执行此操作,但会带来一些性能损失,并且还会引入一些非确定性(您无法确定何时会调用GC)。

C++中没有原生垃圾收集器(还没?)。但管理内存的正确方法是使用smart_pointers(例如std::auto_ptr(在C ++ 11中弃用),std::shared_ptr)等等。

答案 3 :(得分:1)

你想要一本书。你去图书馆并要求你想要的书。图书馆会检查他们是否有这本书(在这种情况下他们会这样做),你很乐意接受它并知道你必须在以后归还。

你回家,坐下来,读完书并完成它。第二天你将书归还给图书馆,因为你已经完成了它。

这是内存分配和垃圾收集的简单类比。计算机的内存有限,就像图书馆的书籍数量有限一样。当你想要分配内存时,你需要发出请求,如果计算机有足够的内存(库有足够的副本),那么你收到的是一块内存。计算机需要内存来存储数据。

由于计算机的内存有限,你需要返回内存,否则就会耗尽(就像没有人将图书归还图书馆那么图书馆什么都没有,计算机会爆炸并在你的眼睛前疯狂燃烧)如果内存不足...... 不是真的)。垃圾收集是用于检查先前已分配的内存是否已不再使用的术语,因此可以将其返回并重新用于其他目的。

答案 4 :(得分:0)

内存分配要求计算机提供一些内存,以便存储数据。例如,在C ++中:

int* myInts = new int[howManyIntsIWant];

告诉计算机为我分配足够的内存来存储一定数量的整数。

另一种做同样事情的方法是:

int myInts[6];

这里的不同之处在于,在第二个例子中,我们知道代码何时被编写和编译我们需要多少空间 - 它是一个int的大小的6 *。这让我们可以进行静态内存分配(在所谓的“堆栈”上使用内存)。

在第一个例子中,我们不知道编译代码时需要多少空间,我们只在程序运行时才知道它,并且我们的值为howManyIntsIWant。这是动态内存分配,它在“堆”上获取内存。

现在,通过静态分配,我们不需要在完成内存时告诉计算机。这与堆栈的工作方式有关;简短的版本是,一旦我们离开了我们创建静态数组的函数,内存就会被直接吞噬掉。

通过动态分配,这不会发生,因此必须以其他方式清理内存。在某些语言中,您必须编写代码来释放此内存,而其他语言则自动完成。这是垃圾收集 - 一些内置于语言中的自动过程将扫描堆上所有动态分配的内存,找出未使用的位并释放它们(即将它们释放给其他进程和程序)。

所以:内存分配=为你的程序要求内存。垃圾收集=编程语言本身可以解决内存不再使用的问题,并为您解除分配。