时间:2021-05-19
1: finalize() 方法
finallize() 方法是Object类的方法, 用于在类被GC回收时 做一些处理操作, 但是JVM并不能保证finalize(0 ) 方法一定被执行,
由于finalize()方法的调用时机具有不确定性,从一个对象变得不可到达开始,到finalize()方法被执行,所花费的时间这段时间是任意长的。我们并不能依赖finalize()方法能及时的回收占用的资源,可能出现的情况是在我们耗尽资源之前,gc却仍未触发,因而通常的做法是提供显示的close()方法供客户端手动调用
所以一般不建议使用finalize 方法, JDK9 开始已久被废除
总结缺点
1: finalize机制本身就是存在问题的。
2:finalize机制可能会导致性能问题,死锁和线程挂起。
3:finalize中的错误可能导致内存泄漏;如果不在需要时,也没有办法取消垃圾回收;并且没有指定不同执行finalize对象的执行顺序。此外,没有办法保证finlize的执行时间。
遇到这些情况,对象调用finalize方法只有被无限期延后
- 观察finalize方法延长类生命周期#
- JDk9 以前的垃圾回收代码
2:Cleaner类的使用
简介:
在Java9 以后 提供了最终类Clear来代替实现,下面看一下官方例子
package Thread;import java.lang.ref.Cleaner;public class CleaningExample implements AutoCloseable{ private final static Cleaner CLEANER=Cleaner.create();// 创建者模式创建对象 static class State implements Runnable{ // 清理对象 下面说 State() { System.out.println("init"); } @Override public void run() { System.out.println("close"); } } private final State state; private final Cleaner.Cleanable cleanable; // clearner 中的接口 实现唯一的清理方法 public CleaningExample() { super(); this.state = new State(); this.cleanable=CLEANER.register(this, state); // 注册清理容器中 并且需要清理对象的引用 } @Override public void close() throws Exception { cleanable.clean(); //进行清理操作 } public static void main(String[] args) { while(true) { new CleaningExample(); } }}上面可以看出:
Cleaner 是最终类 不能被重写, 内部方法基本以静态方法提供 掌握例子上面的方法即可
重点指出
static class State implements Runnable
什么时候被回收?
* 1. 注册的Object处于幻象引用状态
* 2. 显式调用 clean 方法
实际例子(模版)
public class CleaningExample extends Thread implements AutoCloseable { private final static Cleaner CLEANER = Cleaner.create(); private final State state; private final Cleaner.Cleanable cleanable; public CleaningExample() { this.state = new State(); this.cleanable = CLEANER.register(this, state); } @Override public void close() throws Exception { cleanable.clean(); } @SuppressWarnings("resource") public static void main(String[] args) { while (true) { CleaningExample example = new CleaningExample(); } } // 模拟业务请求 @Override public void run() { System.out.println("数据库 海量 查询请求 ................"); } // 清理模版 class State implements Runnable { State() { System.out.println("<--- init --->"); } @Override public void run() { System.out.println("<--- close --->"); } }}实现基础
/** * Heads of a CleanableList for each reference type. */ final PhantomCleanable<?> phantomCleanableList; final WeakCleanable<?> weakCleanableList; final SoftCleanable<?> softCleanableList; // The ReferenceQueue of pending cleaning actions final ReferenceQueue<Object> queue;在CleanerImpl 类进行clearner类的最终实现,看以看到定义的这些个字段,基本上明确了 他的基本原理
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
什么是finalize方法finalize()方法被定义在Java.lang.Object类中,意味着所有的类都可以重载这个方法。java垃圾回收器只之道释放那
本文实例讲述了Java垃圾回收机制的finalize方法。分享给大家供大家参考,具体如下:一点睛finalize方法有如下四个特点:永远不要主动调用某个对象的f
垃圾回收器要回收对象的时候,首先要调用这个类的finalize方法(你可以写程序验证这个结论),一般的纯Java编写的Class不需要重新覆盖这个方法,因为Ob
本教程是为了理解基本的Java垃圾回收以及它是如何工作的。这是垃圾回收教程系列的第二部分。希望你已经读过了第一部分:《简单介绍Java垃圾回收机制》。Java垃
本文实例讲述了Java的垃圾强制回收。分享给大家供大家参考,具体如下:一点睛当一个对象失去引用后,系统何时调用它的finalize()方法对它进行资源清理,何时