Java9中finalize() 的原理是什么?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
公司主营业务:成都网站设计、成都网站制作、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联建站是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联建站推出平和免费做网站回馈大家。
java基本数据类型有哪些
Java的基本数据类型分为:1、整数类型,用来表示整数的数据类型。2、浮点类型,用来表示小数的数据类型。3、字符类型,字符类型的关键字是“char”。4、布尔类型,是表示逻辑值的基本数据类型。
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方法延长类生命周期#
class User{ public static User user = null; @Override protected void finalize() throws Throwable { System.out.println("User-->finalize()"); user = this; } } public class FinalizerTest { public static void main(String[] args) throws InterruptedException { User user = new User(); user = null; System.gc(); Thread.sleep(1000); user = User.user; System.out.println(user != null);//true user = null; System.gc(); Thread.sleep(1000); System.out.println(user != null);//false } }
- JDk9 以前的垃圾回收代码
public class Finalizer { @Override protected void finalize() throws Throwable { System.out.println("Finalizer-->finalize()"); } public static void main(String[] args) { Finalizer f = new Finalizer(); f = null; System.gc();//手动请求gc } } //输出 Finalizer-->finalize()
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
如果直接在类中直接定义实现, 必须提供一个静态内部类 (强制),否者不能进行回收 原因(: 普通内部类 局部内部类 对于外部类有依赖(引用),无法真正实现内存的释放 )
可以选择直接定义外部类 (较为复杂,需要传递清理引用 Cleanable)
什么时候被回收?
* 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
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联行业资讯频道,感谢您对创新互联的支持。
文章名称:Java9中finalize()的原理是什么
URL标题:http://scgulin.cn/article/jsjspd.html