为什么垃圾收集如此重要?

时间:2009-11-08 02:19:19

标签: garbage-collection

我不太了解垃圾收集这么好,然后我想知道,为什么它对语言和开发人员如此重要?

9 个答案:

答案 0 :(得分:18)

许多其他答案都表示垃圾收集可以帮助防止内存泄漏,但令人惊讶的是,似乎没有人提到GC促进内存安全的最重要的好处。这意味着大多数垃圾收集环境完全抽象出内存位置(即原始指针)的概念,从而消除了一大类错误。

例如,手动内存管理的一个常见错误是意外地过早释放值,并在释放后继续使用该位置的内存。这可能非常难以调试,因为可能无法重新分配释放的内存,因此,可以对释放的内存执行看似有效的操作,这些内存只能在程序执行后期出现损坏或内存访问冲突或分段错误的情况下偶尔失败,通常与没有直接链接回到违规代码。在大多数垃圾收集环境中,这类错误根本不存在。

答案 1 :(得分:6)

真的,这是一个维基百科将为你完美回答的问题......文章中甚至还有一个“好处”部分......谷歌搜索并不是那么难......

http://en.wikipedia.org/wiki/Garbage_Collection

答案 2 :(得分:6)

垃圾收集是一种自动内存管理。这是资源管理的一个特例,其中管理的有限资源是内存。

程序员的好处是垃圾收集使程序员免于手动处理内存分配和释放。

答案 3 :(得分:6)

垃圾收集是许多现代语言的一部分,它试图通过开发人员较少的方向干预来抽象处理和重新分配内存。

当您听到“安全”对象的谈话时,这通常指的是在对象超出范围或显式处置后,垃圾收集器可以自动重新分配内存的内容。

虽然您可以在没有垃圾收集器的情况下编写相同的程序来帮助管理内存使用情况,但是抽象出来可以让开发人员考虑更高级别的事情并更快速有效地为最终用户提供价值而无需必须集中精力在该计划的较低层部分。

从本质上讲,开发人员可以说

给我一个新对象

..一段时间后,当对象不再使用(超出范围)时,开发人员不必记得说

抛弃此物件

开发人员懒惰(一种好的美德),有时会忘记事情。正确使用GC时,可以忘记取出垃圾桶,GC不会让它堆积起来并开始闻起来。

答案 4 :(得分:4)

底线是garbage collection 帮助以防止内存泄漏。例如,在.NET中,当没有引用对象时,对象使用的资源被标记为垃圾回收。在非托管语言中,如C和C ++,由开发人员负责清理。

然而,重要的是要注意垃圾收集并不完美。查看this article发生的问题,因为开发人员不知道存在大量内存泄漏。

答案 5 :(得分:3)

在许多较旧且较少严格的语言中,解除分配的内存被程序员硬编码到程序中;这当然会导致问题,如果没有正确完成,因为第二个你引用的内存尚未解除分配您的程序将破坏。为了打击这个垃圾收集,创建了自动释放不再使用的内存。这种系统的好处很容易看到;程序变得更加可靠,解除分配内存有效地从设计过程中删除,调试和测试时间远远短得多。

当然,你没有得到任何东西。你失去的是表现,有时你会注意到程序中的不正常行为,虽然现在有了更现代的语言,但这种情况很少发生。这就是许多典型应用程序都是用Java编写的原因,它编写快速简单,没有追逐内存泄漏的创伤,而且它完成了工作,它非常适合业务领域,性能成本与当今计算机的速度相差无几。 。显然,出于性能原因,一些行业需要在其程序(游戏行业)中管理自己的内存,这就是几乎所有主要游戏都是用C ++编写的原因。一位讲师曾经告诉我,如果每个软件公司都在同一个区域,中间有一个酒吧,你可以告诉游戏开发者除了休息之外,因为他们是那些长时间喝酒的人。

答案 6 :(得分:1)

垃圾收集是允许自动管理内存分配所需的功能之一。这是允许您分配各种对象的原因,可能引入其他变量引用或以某种方式包含这些变量,但从不担心处置对象(当它实际上不再使用时)。

垃圾收集,通过删除未使用的对象并重新打包其他对象,专门负责“清理”找到所有这些对象的堆。

你可能听到很多关于它的信息,因为这是一个关键的功能,它与程序异步发生,如果不能有效处理,会在程序中产生一些随机性能滞后等等。现在算法不过与内存管理有关,特别是GC(垃圾收集)非常有效。

有时提到GC的另一个原因与某个特定对象的析构函数有关。由于应用程序没有(或很少)控制特定对象何时被垃圾收集(因此被破坏),因此如果对象等待其析构函数处理某些资源等,则可能是一个问题。这就是为什么许多对象实现Dispose()方法,它允许显式执行大部分清理(对象本身),而不是推迟直到最终从GC逻辑调用析构函数。

答案 7 :(得分:0)

自动垃圾收集(如java)可以重用内存泄漏或不再使用的内存,从而提高程序的效率。在c ++中,您必须自己控制内存,如果您无法访问内存,则无法再使用该内存,浪费空间。 这是我迄今为止所知道的一年计算机科学和使用/学习java和c ++。

答案 8 :(得分:-1)

因为有人可以编写像

这样的代码

消耗(产生())

不关心清理。就像我们现在的社会一样。