文档章节

第五章ThinkingInJava

酷呐么踏踏
 酷呐么踏踏
发布于 2016/08/17 10:04
字数 640
阅读 13
收藏 0

5.5清理:终结处理和垃圾回收

1.对象可能不被垃圾回收

2.垃圾回收并不等于“析构”

3.垃圾回收只与内存有关

5.5.1finalize()的用途何在

Java有垃圾回收器负责回收无用对象占据的内存资源。但也有特殊情况:假定你的对象(并非使用new)获得一块“特殊”的内存区域,由于垃圾回收器只知道释放那些经由new分配的内存,所以它不知道该如何释放该对象的这块“特殊”内存。为此Java允许在类中定义一个名为finalize()的方法。

它的工作原理“假定”是这样的:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一个垃圾回收动作发生时,才会真正回收对象占用的内存。

5.5.2你必须实施清理

无论是“垃圾回收”还是“终结”,都不保证一定会发生。如果Java虚拟机(JVM)并未面临内存耗尽的情形,它是不会浪费时间去执行垃圾回收以恢复内存的。

5.5.3终结条件

当对某个对象不再感兴趣——也就是它可以被清理了,这个对象应该处于某种状态,使它占用的内存可以安全地释放。例如:要是对象代表了一个打开的文件,在对象被回收前程序员应该关闭这个文件。只要对象中存在没有被适当清理的部分,程序就存在很隐晦的缺陷。finalize()可以用来最终发现这种情况——尽管它并不总是会被调用。

以下是一个简单地例子,示范finalize()可能的使用的方式:

package com.H;

/**
 * 
 * @author l
 *
 */
class Book {
	boolean checkedOut = false;

	Book(boolean checkOut) {
		checkedOut = checkOut;
	}

	void checkIn() {
		checkedOut = false;
	}

	protected void finalize() {
		if (checkedOut) {
			System.out.println("Erro: checked out");
		}
	}
}

public class TerminationCondition {

	public static void main(String[] args) {
		Book novel = new Book(true);
		novel.checkIn();
		new Book(true);
		System.gc();

	}

}/*Output:
Erro: checked out
*///:~

所以Book对象在被当作垃圾回收前都应该被签入(ckeck in)。但是main()方法中,由于程序员的错误,有一本未被签入。要是没有finalize()来验证终结条件,将很难发现缺陷。

注:System.gc()用于强制进行终结动作。即使不这么做,通过重复地执行程序(假设程序将分配大量的存储空间而导致垃圾回收动作的执行),最终也能找出错误的Book对象。

© 著作权归作者所有

共有 人打赏支持
酷呐么踏踏
粉丝 2
博文 39
码字总数 23070
作品 0
太原
程序员
javascript入门经典【推荐】—新手必备、零基础学习

本书目录 第一章: JavaScript语言基础第二章: JavaScript内置对象 第三章: 窗口window对象 第四章: 文档document对象 第五章: 表单form对象 第六章: History与Navigator对象 第七章: ...

a125138
2012/08/01
0
0
哪里可以找到 Kali Linux 的教程?

Kali Linux 秘籍 原书:Kali Linux Cookbook 译者:飞龙 在线阅读 PDF格式 EPUB格式 MOBI格式 Github Git@OSC 目录: 第一章 安装和启动Kali 第二章 定制 Kali Linux 第三章 高级测试环境 第...

wizardforcel0
07/02
0
0
13篇文章,教你学会ES6知识点

ES6 深入理解ES6》学习笔记 本文用于汇总链接到各个子章节的内容,github 欢迎大家题issues和PR,如果对你有帮助,也可以给 star 支持 :) 目录 第一章 块级绑定 第二章 字符串和正则表达式 ...

你听___
05/08
0
0
慕课SpringMVC从入门到精通系列

SpringMVC从入门到精通之第一章 SpringMVC从入门到精通之第二章 SpringMVC从入门到精通之第三章 SpringMVC从入门到精通之第四章 SpringMVC从入门到精通之第五章 SpringMVC从入门到精通第六章...

HenrySun
2016/10/08
72
0
MyBatis3.2.x从入门到精通系列

Java框架篇---Mybatis 入门 MyBatis3.2.x从入门到精通之第一章 MyBatis3.2.x从入门到精通之第二章 MyBatis3.2.x从入门到精通之第三章 MyBatis3.2.x从入门到精通之第四章 MyBatis3.2.x从入门到...

HenrySun
2016/10/07
54
0

没有更多内容

加载失败,请刷新页面

加载更多

一个可能的NEO链上安全随机数解决方案

0x00 困境 链上安全随机数生成应该算是一个比较蛋疼的问题,哪怕你的系统再牛逼,合约程序困在小小的虚拟机里,哪怕天大的本事也施展不开。 更悲催的是,交易执行的时候,是在每一个节点都执...

暖冰
18分钟前
0
0
【大福利】极客时间专栏返现二维码大汇总

我已经购买了如下专栏,大家通过我的二维码你可以获得一定额度的返现! 然后,再给大家来个福利,只要你通过我的二维码购买,并且关注了【飞鱼说编程】公众号,可以加我微信或者私聊我,我再...

飞鱼说编程
今天
1
0
Spring5对比Spring3.2源码之容器的基本实现

最近看了《Spring源码深度解析》,该书是基于Spring3.2版本的,其中关于第二章容器的基本实现部分,目前spring5的实现方式已有较大改变。 Spring3.2的实现: public void testSimpleLoad(){...

Ilike_Java
今天
1
0
【王阳明心学语录】-001

1.“破山中贼易,破心中贼难。” 2.“夫万事万物之理不外于吾心。” 3.“心即理也。”“心外无理,心外无物,心外无事。” 4.“人心之得其正者即道心;道心之失其正者即人心。” 5.“无...

卯金刀GG
今天
2
0
OSChina 周三乱弹 —— 我们无法成为野兽

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ _刚刚好: 霸王洗发水这波很骚 手机党少年们想听歌,请使劲儿戳(这里) hahahahahahh @嘻酱:居然忘了喝水。 让你喝可乐的话, 你准忘不了...

小小编辑
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部