2012-02-07 69 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

你想要一本书。你去图书馆请求你想要的书。图书馆检查他们是否拥有这本书(在这种情况下他们是这样做的),并且你很乐意接受它,并知道你必须稍后再回来。

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

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

由于计算机内存有限,所以您需要返回内存,否则您将用完(就像没有人将书籍返回到库中,那么库不会有任何内容,计算机将在您非常之前爆炸并且剧烈燃烧眼睛,如果它用完了内存... 不是真的)。垃圾收集是检查先前分配的内存是否不再使用的术语,因此可以将其返回并用于其他目的。