大多数程序员都认为垃圾收集是一件好事,在大多数应用程序中都非常值得花费.但是,我个人的观察是,大多数对象的内存管理都是微不足道的,并且可能有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没有复制.为什么这种混合内存管理方案在主流编程语言中显然如此罕见?