随时随地技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)

当垃圾回收机制回收某个对象所占用的内存之前,通常要求程序调用适当的方法来清理资源,在没有明确指定资源清理的情况下,Java提供了默认机制来清理资源,即调用finalize方法,它是Object类的方法,原型为:protected void finalize() throws Throwable ,任何Java类都可以覆盖Object类的finalize方法。 它可以抛出任何类型的异常。垃圾回收机制何时调用对象的finalize方法是完全透明的,只有当程序需要更多额外内存时,才会进行垃圾回收。

finalize方法特点:

1、永远不要主动调用某个对象的finalize方法,该方法应该交给垃圾回收机制调用。

2、该方法何时被调用,是否被调用具有不确定性。

3、当JVM执行去活对象的finalize方法时,可能使该对象或系统中其他对象重新变为激活状态。

4、当JVM 执行finalize方法时出现了异常,垃圾回收机制不会报告异常,程序继续执行。

下面示例演示了如何在finalize方法里把自身复合,通过该程序可以看出垃圾回收的不确定性。

package com.home.finalize;public class TestFinalize {public static TestFinalize tf = null;public void info() {System.out.println("测试finalize方法");}public static void main(String[] args) throws Exception {// 创建TestFinalize对象立即进入去活状态new TestFinalize();// 通知系统进行资源回收System.gc();// 让程序暂停2秒Thread.sleep(2000);tf.info();}public void finalize() {tf = this;}
}

该程序重写了finalize方法,把需要清理的去活对象重写赋给了tf引用变量,从而该对象重新被激活。

另外,如果程序中去掉休眠代码,会报空指针,这说明当调用System.gc()方法后,系统并未立即进行垃圾回收。

另外,System和Runtime类有一个runFinalization方法可以强制垃圾回收机制调用系统中去活对象的finalize方法,就不必使用休眠了,代码如下:

package com.home.finalize;public class TestFinalize {public static TestFinalize tf = null;public void info() {System.out.println("测试finalize方法");}public static void main(String[] args) throws Exception {new TestFinalize();// 创建TestFinalize对象立即进入去活状态System.gc();// 通知系统进行资源回收Runtime.getRuntime().runFinalization();// 强制垃圾回收机制调用去活对象的finalize方法// System.runFinalization();//与上一句代码效果一样tf.info();}public void finalize() {tf = this;}
}
}

经过测试,程序正常运行。
注:本文知识点内容及示例来源于疯狂JAVA讲义一书。

关于Java中的finalize方法相关推荐

  1. 关于java中的finalize()方法

    关于finalize()方法,之前了解的并不是很多,看<java编程思想>时才对此有所了解,之后我又看了些博客,稍微总结了一下finalize()方法: java提供finalize()方 ...

  2. java finalize逃脱_关于Java中的finalize()方法

    java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize(). (1).对象不一定会被回收. (2).垃圾回收不是析构函数. (3).垃圾回收只与内存有关. (4) ...

  3. Java中的finalize方法

    一.介绍 当一个对象没有引用的时候,对象的垃圾回收器会调用finalize方法. 当对象被回收时,系统自动调用该对象的finalize方法,子类可以重写该方法,做一些释放资源的操作. 什么时候被回收: ...

  4. java finalize 作用_java中的finalize方法有什么作用

    java中的finalize方法是Object类中提供的一个方法,在GC准备释放对象所占用的内存空间之前,它将首先调用finalize()方法. finalize()方法是Object类中提供的一个方 ...

  5. Java中的析构方法finalize

    Java中的析构方法finalize 在C++程序设计中有构造函数与析构函数的概念,并且是内存管理技术中相当重要的一部分,而在Java语言中只有构造器(也可以称为构造函数)的概念,却没有析构器或析构函 ...

  6. java 调用 finalize_java finalize方法总结、GC执行finalize的过程

    注:本文的目的并不是鼓励使用finalize方法,而是大致理清其作用.问题以及GC执行finalize的过程. 1. finalize的作用 finalize()是Object的protected方法 ...

  7. JAVA中复制数组的方法

     在JAVA里面,可以用复制语句"A=B"给基本类型的数据传递值,但是如果A,B是两个同类型的数组,复制就相当于将一个数组变量的引用传递给另一个数组;如果一个数组发生改变,那么 ...

  8. Java中的main()方法详解

    源文作者:leizhimin    源文链接:http://lavasoft.blog.51cto.com/62575/53263 源文作者版权申明: 版权声明:原创作品,允许转载,转载时请务必以超链 ...

  9. 如何在java中调用js方法

    [java] view plain copy/* * 加载脚本引擎,并在java中调用js方法 */ public void test2() { ScriptEngineManager manager ...

最新文章

  1. @configurationproperties注解给属性赋值
  2. 关于fixture.debugElement.query(By.css)这个方法的一个疑问
  3. DijKstra算法普通+堆优化链式向前星
  4. 虹软2.0 离线人脸识别 Android 开发 Demo
  5. 自学python3 最好的入门书籍-清华学霸整理,Python入门到精通这几本书帮你快速入行...
  6. SSM Controller 页面之间跳转 重定向,有参 无参问题
  7. jquery几种常用框架比较
  8. Java实现棒子老虎鸡小游戏
  9. Lidar Studio点云处理与分析软件V1.1
  10. 常见的Java框架有哪些?
  11. 学术会议论文查重吗_会议论文查重吗
  12. 友盟分享——微信、腾讯微博、新浪微博分享失败原因分析
  13. flask学习笔记代码篇-10
  14. 武汉理工大学计算机学院在哪个区,武汉理工大学研究生院在哪个校区
  15. 计算机专业海报加文字,巧用字体做海报之——字图穿插
  16. 最全的apple pay苹果支付步奏
  17. 中望CAD机械版学习-1-基础操作
  18. 机器学习可视化技术(Towards Data Science)
  19. Windows编程实现俄罗斯方块
  20. 微信好友头像无法显示的问题

热门文章

  1. day3:多元统计模型
  2. 希尔排序的思路及实现解析
  3. java中多重if结构_java中的多重if
  4. 【NOIP2014普及组】子矩阵
  5. 吴恩达机器学习[9]-神经网络学习
  6. 大三了#我的两年编程生活
  7. 微信小程序--轮播图
  8. 【Niagara 02】Tridium N4使用——照明控制案例
  9. 计算机硬件小论文,计算机硬件小论文
  10. STOpen硬件设计4-周边模块设计二(CAN+RS485+UART+IO扩展等)