一旦垃圾回收器准备释放内存资源的时候首先调用finalize()方法,并在下一次动作真正发生之前才会真正回收对象所占内存,finalize()做的事一些清理工作。有以下特点:
1 垃圾回收只与内存有关
2 对象可能不被垃圾回收
3 垃圾回收不是析构函数
4, 只要程序没有濒临内存耗尽的那一刻,对象占用的资源总得不到释放.直到程序结束后才彻底释放资源
finalize()方法的通用格式如下:
protected void finalize( )
{
// finalization code here
}
finalize() 是一个用于释放非 Java 资源的方法。但是,JVM 有很大的可能不调用对象的finalize() 方法.Java 1.1 通过提供一个System.runFinalizersOnExit() 方法部分地解决了这个问题。不象System.gc() 方法那样,System.runFinalizersOnExit() 方法并不立即试图启动垃圾回收器。而是当应用程序或 Applet 退出时,它调用每个对象的finalize() 方法。通过调用System.runFinalizersOnExit() 方法强制垃圾回收器清除所有独立对象的内存,当清除代码执行时可能会引起明显的延迟。
垃圾回收器工作方式:
停止----复制 先暂停运行程序,吧需要的对象复制搬迁出来,然后删除掉之前的内存空间,这样可以避免碎片的出现,复制出来的对象可以放在一个连续的内存空间中
标记----清扫 从堆栈和静态存储区出发,遍历所有引用,找出所有存活的对象,所有标记的对象不被回收。 这样有个缺点就是回收过后的内存空间是不连续的,如果想得到连续的对象就得要重新整理了
本文探讨了Java中`finalize()`方法在内存回收过程中的作用,强调它不是析构函数,而是在垃圾回收前可能被调用来进行资源清理。垃圾回收机制包括停止-复制和标记-清扫两种方式,前者避免碎片但可能导致程序暂停,后者则可能导致非连续的内存空间。`System.runFinalizersOnExit()`方法可以在应用退出时强制执行`finalize()`,但这可能导致显著的延迟。
216

被折叠的 条评论
为什么被折叠?



