让我们想一下内存泄漏程序,其中没有释放堆内存块并且程序终止。如果这是(比如说)Java程序,那么内置的垃圾收集器会在程序退出之前自动释放该堆块。
但是即使在C ++中,如果程序退出,内核也不会自动解除分配与该进程相关的所有空间。同样在Java代码中,内核必须为进程的文本部分(代码)解除分配空间(即使堆栈和堆部分由垃圾收集器解除分配)。使用垃圾收集器功能的总体优势是什么 - 只是通过程序本身而不是内核解除分配堆所需的时间增加了? (如果有任何这样的节省)
编辑:我的主要疑问是查看响应 - 当内存使用量达到极限时,GC会自动调用吗?因为,如果仅在程序终止之前调用GC,则对于长程序它不会有用。
答案 0 :(得分:1)
所以不,GC不是为了节省时间。这是为了节省大量内存,防止长时间运行的分配密集型程序占用所有可用内存,并最终使每个人死于内存不足错误。
答案 1 :(得分:0)
假设程序分配了一些资源,它一直在运行时使用它,但在退出之前不会正确释放它。当这个程序退出时,内核会释放所有程序资源 - 没关系。
现在考虑一些函数在每次调用时创建内存泄漏的情况,并且此函数在一秒钟内被调用100次。几分钟或几小时后,此程序崩溃,因为没有空闲内存。
糟糕的是,使类型1的内存和资源泄漏的程序员通常会造成类型2的泄漏,从而产生脏的和不稳定的代码。专业程序员用0资源和内存泄漏编写完美的代码。如果垃圾收集器可用 - 没关系。如果不是 - 自己管理资源。
顺便说一下,仍有可能使用垃圾收集器进行泄密 - 就像众所周知的.NET事件源 - 消费者泄漏一样。因此,垃圾收集器非常有用,节省了大量的开发人员时间,但无论如何开发人员必须仔细管理程序资源。