垃圾回收对性能有影响吗?

7

我刚刚在阅读关于几种编程语言性能的文章时,发现垃圾回收经常被提到。垃圾回收是否会影响语言的性能?如果是,如何影响?

3个回答

4
在这里要记住的一件事是,没有垃圾回收机制的语言仍然需要分配和释放对象。垃圾回收允许“释放”部分在批处理中进行,并且在应用程序相对空闲的时候进行。在内存约束较小的环境中,大多数收集甚至可能推迟到程序完成之后。换句话说,高效的垃圾收集器有可能比传统平台上的常见做法更快...虽然我们还没有完全达到那个程度,但这一点正在不断改进。
关键在于当垃圾收集发生时,收集器仍然必须花费资源来分析哪些是可达的,哪些是不可达的,或者哪些具有引用计数> 0,哪些没有(取决于收集器的类型)。这是一个真正的性能惩罚。此外,这个过程确实会短暂地中断正常执行。
这种中断尤其对于对延迟问题敏感的应用程序来说可能是一个重要因素。这包括提供网络内容的常见场景。幸运的是,现在也有垃圾收集器模式来减少这种影响。
对于大多数垃圾回收平台来说,评估性能时需要考虑垃圾收集器。垃圾收集器的净效果可能在应用程序会话的整个生命周期中是微不足道的,甚至可能是正面的!但是,在短暂的时间段内可能会有显著的负面影响,因此了解如何缓解这些问题非常重要。
以上都是平台无关的。就个人而言,我最熟悉的是.Net环境。在这个特定领域中,特别是在之前提到的网络服务挑战方面,需要注意的是确保使用GC的服务器模式,保持与最新版本的框架同步(在最近的发布版本中,已经进行了大量的性能优化工作),尽量避免大对象堆的使用,首先尽量减少分配,并且要有适当的监控机制。

3

这基本上取决于编程语言/运行时环境。

在某些实现中,GC会暂停您的应用程序(挂起线程),然后进行垃圾回收,因此会出现性能问题。

一些实现执行优化,使您的代码在GC收集未引用对象时运行。例如,.Net GC可以被调整用于不同的收集模式和对象堆,并且您也可以提示它不要在对性能敏感的代码区域运行。

由于所有这些都是实现特定的,我无法提供更多细节。但我应该提到的是,语言运行时通常会尝试非常努力地优化它们的GC,大部分时间你甚至不会注意到它的存在。然而,在非常特定的情况下可能会出现问题,并希望有可能解决这个问题以最小化GC压力。


追加:.Net通过将_collection_与_compaction_分离来进行优化。因为它处理整合内存空洞作为一个独立的进程的一部分,所以GC可以在其他线程运行时执行其任务,因此不会将对象从另一个线程下面移动。 - Joel Coehoorn

1

垃圾回收是一种机制,用于清理未被使用的对象以释放资源分配,垃圾收集器基于一个强大的算法来分配哪些对象应该被清除,哪些不应该。这个过程会消耗资源,因此建议开发者应明确释放或清理未使用的对象。

为了改善应用程序的性能和资源消耗,应考虑使用适当的集合。强类型和数组始终具有优先使用的高级别,以避免装箱/拆箱,并减少管理集合所需的资源成本。

请参考使用Array、ArrayList、HashTable。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接