【学习笔记】Java finalize()的使用
《Java编程思想》中有提到,Java的垃圾回收器并不是那么靠谱,垃圾回收会占用很大的资源开销,垃圾回收器很懒,当变量和对象不再被引用、脱离作用域的时候,垃圾回收器会不定时的进行垃圾回收,也就是说,当内存资源紧张的时候,垃圾回收器才会以最快速度主动去回收资源释放内存,其他时候可能会回收也可能不会。
如果当垃圾回收器工作的时候,会自动调用finalize(),查看Object类的源码会发现这个方法是个空方法(先不管底层),是不是说这个方法我们可以去重写呢?
package com.github.hellxz.thinkinjava; public class TestFinalize { public static void main(String[] args) {
/*
* 创建FinalizeMethod类并调用
*/
TestFinalize f = new TestFinalize();
f.finalize();
System.out.println("mian方法结束");
} /*
* 重写了Object类的方法
*/
protected void finalize(){
System.out.println("finalize方法执行了");
} }
//输出:
//finalize方法执行了
//mian方法结束
看了上述代码,我们证实了Object类的这个方法的确是可以被重写的,在书中说finalize是在垃圾回收器删除对象之前调用的方法,那么修改上述代码进行测试
package com.github.hellxz.thinkinjava; public class TestFinalize { public static void main(String[] args) {
/*
* 创建FinalizeMethod类并调用
*/
TestFinalize f1 = new TestFinalize();
TestFinalize f2 = new TestFinalize();
TestFinalize f3 = new TestFinalize();
TestFinalize f4 = new TestFinalize(); System.out.println("mian方法结束");
} /*
* 重写了Object类的方法
*/
protected void finalize(){
System.out.println("finalize方法执行了");
} }
//输出:
//mian方法结束
虽然我们创建了这么多对象,而且都没有使用,但是重写的finalize方法并没有执行,这说明垃圾回收器并没有回收。Java中有System.gc()来强制垃圾回收器终结动作;为了使代码更有说服力,修改一下代码结构,使更直观
package com.github.hellxz.thinkinjava; public class TestFinalize {
public static void main(String[] args) { Apple a1 = new Apple(1);
Apple a2 = new Apple(2);
Apple a3 = new Apple(3);
Apple a4 = new Apple(4);
a1 = null; //置空a1
a2 = null; //置空a2
System.gc();
System.out.println("mian方法结束");
}
} class Apple{ private int i;
public Apple(int i){
this.i = i;
System.out.println("apple "+ i +" is created!");
} protected void finalize() throws Throwable {
super.finalize(); //调用Object类方法
System.out.println("apple "+ i +" is disposed!");
}
}
//output:
//apple 1 is created!
//apple 2 is created!
//apple 3 is created!
//apple 4 is created!
//mian方法结束
//apple 1 is disposed!
//apple 2 is disposed!
结论:
1、不要过分依赖finalize方法来执行资源清除工作,垃圾回收器会自动回收资源的
2、finalize不同于c++的析构函数,无需主动释放内存,想调用可以使用System.gc();
3、finalize用于清除非Java语言占用的内存,以及检查错误
4、垃圾回收器不会一有垃圾就回收内存,除非内存吃紧
【学习笔记】Java finalize()的使用的更多相关文章
- [java学习笔记]java语言核心----面向对象之this关键字
一.this关键字 体现:当成员变量和函数的局部变量重名时,可以使用this关键字来区别:在构造函数中调用其它构造函数 原理: 代表的是当前对象. this就是所在函数 ...
- [java学习笔记]java语言核心----面向对象之构造函数
1.构造函数概念 特点: 函数名与类名相同 不用定义返回值类型 没有具体的返回值 作用: 给对象进行初始化 注意: 默认构造函数 多个构造函数是以重载出现的 一个类中如果 ...
- 学习笔记——Java类和对象
今天学习了Java的类和对象的相关知识,由于Java面向对象的编程的思想和C++几乎一样,所以需要更多的关注Java的一些不同之处. 1.类 1.1 在类这一块,除了基本的成员变量,成员方法,构造函数 ...
- Java学习笔记 -- Java定时调度工具Timer类
1 关于 (时间宝贵的小姐姐请跳过) 本教程是基于Java定时任务调度工具详解之Timer篇的学习笔记. 什么是定时任务调度 基于给定的时间点,给定的时间间隔或者给定的执行次数自动执行的任务. 在Ja ...
- 大数据学习笔记——Java篇之网络编程基础
Java网络编程学习笔记 1. 网络编程基础知识 1.1 网络分层图 网络分层分为两种模型:OSI模型以及TCP/IP网络模型,前者模型分为7层,是一个理论的,参考的模型:后者为实际应用的模型,具体对 ...
- 大数据学习笔记——Java篇之IO
IO学习笔记整理 1. File类 1.1 File对象的三种创建方式: File对象是一个抽象的概念,只有被创建出来之后,文件或文件夹才会真正存在 注意:File对象想要创建成功,它的目录必须存在! ...
- 大数据学习笔记——Java篇之集合框架(ArrayList)
Java集合框架学习笔记 1. Java集合框架中各接口或子类的继承以及实现关系图: 2. 数组和集合类的区别整理: 数组: 1. 长度是固定的 2. 既可以存放基本数据类型又可以存放引用数据类型 3 ...
- [Java学习笔记] Java异常机制(也许是全网最独特视角)
Java 异常机制(也许是全网最独特视角) 一.Java中的"异常"指什么 什么是异常 一句话简单理解:异常是程序运行中的一些异常或者错误. (纯字面意思) Error类 和 Ex ...
- 设计模式学习笔记——java中常用的设计模式
单例设计模式(Singleton Pattern) 观察者模式(Observer Pattern) 工厂模式(Factory Pattern) 策略模式(Strategy Pattern) 适配器模式 ...
- Thinking in java学习笔记之finalize
finalize:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下次垃圾回收动作发生时,才会真正回收对象占用的内存,所以可用此作为对象终结条件的验证.注意的三 ...
随机推荐
- Angularjs 2 绝对零基础的教程(1):从安装配置开始
写在前面 适合人群: 1. 愿意未来从事前端工作,并以此开拓自己未来职业 2. 有任何一种编程语言基础 3. 喜欢简单粗暴学一门实用的技术,而不是做科研. Angular 2 比 Angular 1 ...
- Webpack 2 视频教程 015 - Webpack 2 中的文件压缩
原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...
- JQ trigger函数无法触发a标签的两种解决方法
起因:点击icon图标后要触发a标签的链接转跳动作,但是用 JQ 的 $('#a').trigger('click') 居然不起作用,遂百度之,总结两种方法如下: (原因:JQ 的 trigger() ...
- shell的含义
shell:壳,是操作linux最直接的方式,通过shell中输入命令和linux系统进行交互. shell是一个小盒子,每一个有独立的命名空间,登录后的操作就是一个shell(有可能是bash,zs ...
- Python新手需要掌握的知识点
一.基础语法 1 变量 2 逻辑判断 3 循环 4 函数 二.数据结构 1 数字(加减乘除) 2 字符串(一串字符) 3 布尔 (真假) 4 元组 (不能修改的列表) 5 列表(Python的苦力,最 ...
- 该帐户当前被锁定,所以用户sa登录失败。系统管理员无法将该帐户解锁
运行程序时抛出异常: 基础提供程序在 Open 上失败,详细信息:该帐户当前被锁定,所以用户sa登录失败.系统管理员无法将该帐户解锁. 1.考虑连接字符串是否正常 登录数据库,发现登录报同样的错误 = ...
- Netty入门之客户端与服务端通信(二)
Netty入门之客户端与服务端通信(二) 一.简介 在上一篇博文中笔者写了关于Netty入门级的Hello World程序.书接上回,本博文是关于客户端与服务端的通信,感觉也没什么好说的了,直接上代码 ...
- [js高手之路] vue系列教程 - vue的事件绑定与方法(2)
一.在vue中,绑定事件,用v-on:事件类型, 如绑定一个点击事件, 我们可以这样子做 window.onload = function () { var c = new Vue({ el : 'b ...
- Nginx集群之基于Redis的WebApi身份验证
目录 1 大概思路... 1 2 Nginx集群之基于Redis的WebApi身份验证... 1 3 Redis数据库... 2 4 Visualbox ...
- 【读书笔记与思考】《python数据分析与挖掘实战》-张良均
[读书笔记与思考]<python数据分析与挖掘实战>-张良均 最近看一些机器学习相关书籍,主要是为了拓宽视野.在阅读这本书前最吸引我的地方是实战篇,我通读全书后给我印象最深的还是实战篇.基 ...