内存管理与垃圾收集(三)
----垃圾收集前的处理工作
对象被作为垃圾清理出内存之前,有可能需要一些扫尾的工作,在Java中这些扫尾工作的代码可以编写在被收集对象的finalize方法之中。
(1)finalize方法的重写
finalize方法来自Object类,因此每一个类都有此方法。在一个对象被作为垃圾收集之前,垃圾收集器会首先调用垃圾收集对象的finalize方法,然后再清除垃圾对象。如果在对象被垃圾收集时希望系统执行特定的代码,就需要重写finaliz方法。
重写此方法时一般不但要编写自己类特定的处理代码,还应该使用"Super.finalize();"调用父类的finalize方法。如果没有重写该方法,则在垃圾收集时会调用父类的此方法,直至追溯到Object类的finalize方法。
(2)finalize方法的安全问题
如果在finalize方法中编写一些恶意代码,在每次执行finalize方法时使自己这个对象不再满足垃圾的条件,就可以阻止垃圾收集,产生恶意的常驻对象。
为避免上述情况,在Java中规定,一个对象的声明周期中finalize方法最多被执行一次。也就是说,若第一次执行垃圾收集时执行此方法组织了垃圾收集,第二次在执行垃圾收集时不会再执行此方法,而是直接清除垃圾对象。
(3)最终守护者模式
如果开发人员概念理解不深刻,在重写finalize方法时忘记级联调用父类的finalize方法,这时有可能会带来严重的问题。
注:构造器的自动级联调用机制设计得就非常好,避免了类似问题的发生。
java中有很多的设计模式,父类的开发人员可以通过使用最终守护者模式来避免此问题的发生。
----垃圾收集前的处理工作
对象被作为垃圾清理出内存之前,有可能需要一些扫尾的工作,在Java中这些扫尾工作的代码可以编写在被收集对象的finalize方法之中。
(1)finalize方法的重写
finalize方法来自Object类,因此每一个类都有此方法。在一个对象被作为垃圾收集之前,垃圾收集器会首先调用垃圾收集对象的finalize方法,然后再清除垃圾对象。如果在对象被垃圾收集时希望系统执行特定的代码,就需要重写finaliz方法。
重写此方法时一般不但要编写自己类特定的处理代码,还应该使用"Super.finalize();"调用父类的finalize方法。如果没有重写该方法,则在垃圾收集时会调用父类的此方法,直至追溯到Object类的finalize方法。
(2)finalize方法的安全问题
如果在finalize方法中编写一些恶意代码,在每次执行finalize方法时使自己这个对象不再满足垃圾的条件,就可以阻止垃圾收集,产生恶意的常驻对象。
为避免上述情况,在Java中规定,一个对象的声明周期中finalize方法最多被执行一次。也就是说,若第一次执行垃圾收集时执行此方法组织了垃圾收集,第二次在执行垃圾收集时不会再执行此方法,而是直接清除垃圾对象。
(3)最终守护者模式
如果开发人员概念理解不深刻,在重写finalize方法时忘记级联调用父类的finalize方法,这时有可能会带来严重的问题。
注:构造器的自动级联调用机制设计得就非常好,避免了类似问题的发生。
java中有很多的设计模式,父类的开发人员可以通过使用最终守护者模式来避免此问题的发生。