清除:finalization和垃圾回收
由于垃圾回收器只知道释放那些由new分配的内存,不知道如何释放对象的“特殊”内存。为解决这个问题,Java提供了一个名为finalize()的方法。
finalize()的工作原理是:当垃圾收集器准备好释放对象占用的存储空间,首先调用finalize(),而且只有在下一次垃圾收集过程中,才会真正回收对象的内存。
所以如果使用finalize(),就可以在垃圾收集期间进行一些重要的清除或清扫工作。
要记住:垃圾回收不是销毁
Java中的对象并不一定会被当做垃圾回收过去
有时可能一个对象的存储空间永远都不会释放,可能程序永远都接近于用光的临界点。当程序执行结束且垃圾收集器一直都没有释放我们创建的任何对象的存储空间,则随着程序的退出,那些资源会返回给操作系统。这是一件好事情,因为垃圾收集本身也要消耗一些开销。如永远都不用它,那么永远也不用支出这部分开销。
finalize()的用途
首先要记住:垃圾收集只和内存有关
即垃圾回收器存在的唯一目的是回收程序不再使用的内存。所以finalize()方法也必须只和内存及回收有关。但是垃圾回收器会处理好所有对象内存的释放,不管对象是怎么创建的。所以finalize()方法被限制于主要处理特殊情况,即对象通过非创建对象的方式来分配内存的情况。
之所以要使用finalize(),看起来似乎是由于有时需要采取与Java的普通方法不同的一种方法,通过分配内存来做一些具有C语言风格(Clike)的事情
所以要避免过多的使用finalize()
注意:垃圾回收或finalize()方法不保证一定会发生,如Java虚拟机内存损耗殆尽时,它不会执行垃圾回收的。
总结:
何种对象会被Java虚拟机视为垃圾,主要包括以下两种情况:
- 对象引用超过其作用范围,这个对象将被视为垃圾
- 将对象赋值为Null
垃圾回收器只能回收那些由new操作符创建的对象
可以使用finalize()方法清除
Java提供了System.gc()方法强制启动垃圾回收器,这就像给120打电话通知医院来救护病人一样