之所以要有finalize(),是由于在分配内存时可能采用了C语言中的做法,而非Java中的通常做法。这种情况主要发生在使用“本地方法”的情况下,本地方法是一种在Java中调用非Java代码的方式。本地方法目前只支持C和C++,但它们可以调用任何代码。在非Java代码中,也许会调用的malloc()函数系列来分配存储空间,而且除非调用了 free()函数,存储空间将得不到释放,从而造成内存泄漏,所以要在finalize()中用本地方法调用它。即:它不是进行普通的清理工作的合适场所。
(一)概述
(1)GC只负责对象内存相关的清理,其他资源如文件句柄,db连接需要手动清理,以防止系统资源不足崩溃。
(2)System.gc()只是建议JVM执行GC(垃圾回收器),但到底GC执行与否,是由JVM决定的。
(3)一个简单对象的生命周期为 :unfinalized finalizable finalized reclaimed
(二) finalize()介绍
(1)finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法。
(2)finalize()与C++中的析构函数不是对应的,在Java中的finalize方法在垃圾回收器准备垃圾回收前被调用,具有不确定性。
(三)finalize()的执行过程
转载:
https://blog.csdn.net/chenwiehuang/article/details/80725691?utm_source=blogxgwz1
https://blog.csdn.net/qq_36761831/article/details/81211540
(四)示例
// gc() 方法表示把拉级回收器启动,把拉圾收走
public TestClass() {
//每个类里面都有finalize方法,和构造方法功能相反,一个是对象产生时调用,一个是对象消亡时调用
public void finalize() {
System.out.println("清理对象...");
}
public static void main(String[] args) {
//下面三个对象一产生即成为拉圾
new TestClass();
new TestClass();
new TestClass();
//如果不加上下面这句,以上产生的三个对象虽成为拉圾,但不一定马上就会启用拉圾回收机制把拉圾回收走
//所以就可能看不到 finalize 方法内部执行的效果
System.gc();
}
}
public class B {
static B b;
public void finalize() {
System.out.println("method B");
b = this;
}
public static void main(String[] args) {
B b = new B();
b = null;
System.gc(); //GC检查后放入 F queue ,然后执行了finalize()方法,该对象可达了,即对象再生
B.b = null;
System.gc(); //第一次finalize运行后,该对象的finalizable置为false了,所以该对象即使再
} //被GC运行,也不会执行finalize方法了
}
注:不要频繁使用gc函数(垃圾回收本身就有一定的开销,不利于性能的发挥,但是它会降低内存的使用),要保持代码健壮(注意将不用的变量置为null),让JVM虚拟机去管理内存。