关于Java中的finalize方法
随时随地技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(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方法相关推荐
- 关于java中的finalize()方法
关于finalize()方法,之前了解的并不是很多,看<java编程思想>时才对此有所了解,之后我又看了些博客,稍微总结了一下finalize()方法: java提供finalize()方 ...
- java finalize逃脱_关于Java中的finalize()方法
java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize(). (1).对象不一定会被回收. (2).垃圾回收不是析构函数. (3).垃圾回收只与内存有关. (4) ...
- Java中的finalize方法
一.介绍 当一个对象没有引用的时候,对象的垃圾回收器会调用finalize方法. 当对象被回收时,系统自动调用该对象的finalize方法,子类可以重写该方法,做一些释放资源的操作. 什么时候被回收: ...
- java finalize 作用_java中的finalize方法有什么作用
java中的finalize方法是Object类中提供的一个方法,在GC准备释放对象所占用的内存空间之前,它将首先调用finalize()方法. finalize()方法是Object类中提供的一个方 ...
- Java中的析构方法finalize
Java中的析构方法finalize 在C++程序设计中有构造函数与析构函数的概念,并且是内存管理技术中相当重要的一部分,而在Java语言中只有构造器(也可以称为构造函数)的概念,却没有析构器或析构函 ...
- java 调用 finalize_java finalize方法总结、GC执行finalize的过程
注:本文的目的并不是鼓励使用finalize方法,而是大致理清其作用.问题以及GC执行finalize的过程. 1. finalize的作用 finalize()是Object的protected方法 ...
- JAVA中复制数组的方法
在JAVA里面,可以用复制语句"A=B"给基本类型的数据传递值,但是如果A,B是两个同类型的数组,复制就相当于将一个数组变量的引用传递给另一个数组;如果一个数组发生改变,那么 ...
- Java中的main()方法详解
源文作者:leizhimin 源文链接:http://lavasoft.blog.51cto.com/62575/53263 源文作者版权申明: 版权声明:原创作品,允许转载,转载时请务必以超链 ...
- 如何在java中调用js方法
[java] view plain copy/* * 加载脚本引擎,并在java中调用js方法 */ public void test2() { ScriptEngineManager manager ...
最新文章
- @configurationproperties注解给属性赋值
- 关于fixture.debugElement.query(By.css)这个方法的一个疑问
- DijKstra算法普通+堆优化链式向前星
- 虹软2.0 离线人脸识别 Android 开发 Demo
- 自学python3 最好的入门书籍-清华学霸整理,Python入门到精通这几本书帮你快速入行...
- SSM Controller 页面之间跳转 重定向,有参 无参问题
- jquery几种常用框架比较
- Java实现棒子老虎鸡小游戏
- Lidar Studio点云处理与分析软件V1.1
- 常见的Java框架有哪些?
- 学术会议论文查重吗_会议论文查重吗
- 友盟分享——微信、腾讯微博、新浪微博分享失败原因分析
- flask学习笔记代码篇-10
- 武汉理工大学计算机学院在哪个区,武汉理工大学研究生院在哪个校区
- 计算机专业海报加文字,巧用字体做海报之——字图穿插
- 最全的apple pay苹果支付步奏
- 中望CAD机械版学习-1-基础操作
- 机器学习可视化技术(Towards Data Science)
- Windows编程实现俄罗斯方块
- 微信好友头像无法显示的问题