Thursday, February 26, 2009

GarbageCollection

在C++中,使用new配置的对象,必须使用delete来清除对象,以释放对象所占据的内存空间。如果没有进行这个动作,若对象不断的产生,内存就会不断的被对象耗用,最后使得内存空间用尽。在C++中有析构函数,它会在对象被清除前执行,通常delete会在这个方法中被执行,然而如果不小心清除了尚在使用中的对象,则程序就会发生错误甚至整个崩溃

在Java中,使用new配置的对象,基本上也必须清楚以回收对象所占用的内存空间,Java提供垃圾回收机制,在适当的时候,Java执行环境会自动检查对象,看看是否有未被参考的对象,如果有 就清除,回收对象所占据的内存空间

在Java中无法得知垃圾回收的时间,它可能会在内存资源不足的时候,或是在程序执行空闲的时候,可以建议执行环境进行收集,但收集并不一定会马上执行。

Java中 没有析构函数,但有finalize()方法,它被声明为protected,finalize()方法会在对象被回收时执行,但不可以将它当做析构函数来使用,因为不知道对象资源何时被回收,所以也就不知道finalize()真正被执行的时间,也就无法立即执行所指定的资源回收动作。但可以使用finalize()来进行一些相关资源的清除动作,如果这些动作与立即性的收尾动作没有关系的话。

如果确定不再使用某个对象,可以参考在该对象的名称上指定null,表示这个名称不再参考至任何对象,不被任何名称参考的对象将会被回收。
可以使用System.gc()建议程序进行垃圾收集,如果建议被采纳。则对象资源会被回收,回收前会执行finalize()方法。

No comments:

Post a Comment