【发布时间】:2009-02-12 15:10:46
【问题描述】:
大多数程序员都同意垃圾收集是一件很棒的事情,并且在大多数应用程序中是非常值得的开销。然而,我个人的观察是,大多数对象的内存管理都是微不足道的,其中可能有 10%-20% 需要考虑诸如引用计数和一般非常复杂的内存管理方案之类的杂项。在我看来,通过保守地手动删除对象生命周期明显的大对象并让 GC 收集其余的对象,假设 GC 实现支持这样的事情,只需一小部分开销即可获得垃圾收集的所有好处.这将使 GC 运行的频率大大降低,消耗的多余内存也更少,同时仍然避免了实际上难以手动管理的情况。更有趣的是,如果编译器在生命周期很明显的地方自动插入确定性删除语句:
int myFunc() {
Foo[] foo = new Foo[arbitraryNumber]; // May be too big to stack allocate.
// do stuff such that the compiler can prove foo doesn't escape.
// foo is obviously no longer needed, can be automatically deleted here.
return someInteger;
}
当然,这可能不适用于复制 GC,但为了这篇文章,我们假设我们的 GC 没有复制。为什么这种混合内存管理方案在主流编程语言中显然如此罕见?
【问题讨论】:
-
关于“个人观察”的模糊断言对其他程序员没有帮助。你测量过什么?
标签: performance memory-management programming-languages garbage-collection