现代大多数编程语言都内置垃圾回收(GC),例如Java、.NET语言、Ruby等。确实,GC在许多方面简化了应用程序开发。
我想知道使用具有GC的语言编写应用程序的限制/缺点。假设GC实现是最佳的,我只是想知道我们可能会被GC限制做出一些优化决策。
现代大多数编程语言都内置垃圾回收(GC),例如Java、.NET语言、Ruby等。确实,GC在许多方面简化了应用程序开发。
我想知道使用具有GC的语言编写应用程序的限制/缺点。假设GC实现是最佳的,我只是想知道我们可能会被GC限制做出一些优化决策。
在我看来,使用垃圾回收器的主要缺点是:
资源的非确定性清理。有时候,我们希望立即清理某些资源,但是使用垃圾回收器通常意味着强制进行全局清理或者等待垃圾回收器自行清理,这都会削弱开发者的一些控制权。
由于垃圾回收器的非确定性操作可能导致的潜在性能问题。当垃圾回收器进行回收时,通常会出现(小)卡顿等问题。这对于实时模拟或游戏等应用程序尤其具有问题。
来自一位C程序员的建议...关键在于成本效益和适当的使用
垃圾回收算法(如三色标记/标记清除)中通常存在着资源“丢失”与物理资源释放之间的显著延迟。在某些运行时中,垃圾回收甚至会暂停程序执行以执行垃圾回收。
作为一名长期从事C编程的人,我可以告诉你:
a) 手动free()垃圾回收很难 - 这是因为人工放置free()调用的错误率通常比GC算法高。
b) 手动free()垃圾回收需要时间 - 调试所花费的时间是否大于GC的毫秒级暂停?如果你正在编写游戏而不是嵌入式内核,使用垃圾回收可能是有利的。
但是,当你无法承受运行时劣势(正确的资源、实时约束)时,手动资源分配可能更好。虽然可能需要时间,但可以做到100%的效率。
试想一下,用Java编写操作系统内核?或者在.NET运行时上使用GC......只需看看JVM在运行简单程序时积累的内存量。我知道这样的项目存在......它们只会让我感到有些不适。
只要记住,现在我的Linux桌面配备了3GB RAM,与多年前512MB RAM时做的事情基本相同。唯一的区别是现在运行了Mono/jvm/Firefox等。
GC的商业案例很清楚,但它仍然经常让我感到不舒服。
好的书籍:
在性能方面(尤其是实时系统),最大的问题是当GC启动时,您的程序可能会遇到一些意外的延迟。但是,现代GC试图避免这种情况,并且可以针对实时目的进行调整。
另一个明显的问题是,您不能自己管理内存(例如,在分布式共享内存上分配),当您实现低级软件时可能需要这样做。
free
的调用来节省资源。 - J D