杭州定制网站建设,河北建设厅网站查询,安徽省住建厅网站官网,质感设计网站垃圾回收器#xff08;garbage colector#xff09;决定回收某对象时#xff0c;就会运行该对象的 finalize() 方法 但是在 Java 中很不幸#xff0c;如果内存总是充足的#xff0c;那么垃圾回收可能永远不会进行#xff0c;也就是说 filalize() 可能永远不被执行#x…垃圾回收器garbage colector决定回收某对象时就会运行该对象的 finalize() 方法 但是在 Java 中很不幸如果内存总是充足的那么垃圾回收可能永远不会进行也就是说 filalize() 可能永远不被执行显然指望它做收尾工作是靠不住的。 那么finalize() 究竟是做什么的呢 它最主要的用途是回收特殊渠道申请的内存。Java 程序有垃圾回收器所以一般情况下内存问题不用程序员操心。但有一种 JNIJava Native Interface调用non-Java 程序C 或 C finalize() 的工作就是回收这部分的内存。 finalize() 方法
Java 可以使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做一些必要的清理工作。
finalize()方法什么时候被调用
这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。
析构函数(finalization) 的目的是什么
析构函数的目的是在清除对象前完成一些清理工作比如释放内存等。
final 和 finalize 的区别
final关键字可以用于类、方法、变量前用来表示该类、方法、变量具有不可变的特性。 finalize方法用于回收资源可以为任何一个类添加finalize方法。该方法将在垃圾回收器清除对象之前调用。 与toString方法类似finalize方法也是Java中所有类中必有的方法因为它是属于Object根类的方法默认情况下Java中所有的类都是Object类的子类。 finalize方法会被自动调用调用的时机为在销毁(回收)该对象前finalize方法会被自动调用 以上这句话听起来的确很抽象什么是销毁(回收)对象呢所谓的销毁对象就是把该对象所占用的堆内存空间给释放掉也就是释放出更多的内存资源释放出来的内存空间可以供别的对象使用这一点是非常重要的。 搞清楚这个问题之后我们就要思考什么时候会销毁对象呢当垃圾回收器确定不存在该对象的更多引用时由垃圾回收器自动调用该方法。我画一个图解释一下比如说我现在有一个Dog对象它在堆内存中占了一片空间此时d是这个对象的引用。如下图所示 当我调用完Dog对象的eat方法之后以后就再也不使用这个Dog对象了可以将d赋值为null那么原来那个Dog对象就没有被引用了将来也不会再用到。此时垃圾回收器会自动回收或者说销毁该对象那是不是一把d赋值为null就马上销毁该对象呢不是的垃圾回收器到底什么时候回收该对象有它自己的规则并不是说该对象没被引用了马上回收该对象我们也可以来进行验证一下根据上文的描述我们知道当该对象被回收时会先去调用finallize方法默认情况下子类的finalize方法是继承自Object父类先来看看Object父类中的finalize方法是如何编写的如下图所示
根据观察可以发现Object类的finalize方法中没有任何的代码。为了方便观察到效果我们在Dog类中重写父类Object的finalize方法如下图所示 重写完之后我们运行程序来验证finalize方法在此时是否会被自动调用此时main方法中的代码是这样的在第7行已经将d赋值为null意味着Dog对象已经没有任何引用了。 运行程序结果如下所示观察发现明明Dog对象已经没有被引用了为什么finalize没有被调用呢如我刚刚所说虽然Dog对象没有被引用但是垃圾回收器并不会马上回收Dog对象它有自己的回收时机现在只能确定该Dog对象已经可以被回收了但是还没被回收所以finalize方法没有被调用。 为了看到显示的效果我们可以编写代码手动调用垃圾回收器让它回收该Dog对象在main方法中我们添加上这样一句代码调用垃圾回收器 再次运行程序观察结果发现finalize方法果然被自动调用了但是你再仔细观察代码发现代码的输出是先执行第9行然后再去调用finalize方法也就是说System.gc调用之后并不会阻塞在那里等调用完finalize方法之后再执行第9行而是一调用垃圾回收器就继续运行代码了就先输出了第9行的代码finalize方法反而在其后这是允许的。 在实际的编程开发中finalize方法一般是用来释放资源(比如数据库的连接对象文件流的对象等这些都叫资源)的且作为程序员我们很少在子类中去重写这个方法。