文档章节

第五章ThinkingInJava

酷呐么踏踏
 酷呐么踏踏
发布于 2016/08/17 10:04
字数 640
阅读 13
收藏 0
点赞 0
评论 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
博文 32
码字总数 21543
作品 0
太原
程序员
javascript入门经典【推荐】—新手必备、零基础学习

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

a125138 ⋅ 2012/08/01 ⋅ 0

哪里可以找到 Kali Linux 的教程?

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

wizardforcel0 ⋅ 2016/11/08 ⋅ 0

13篇文章,教你学会ES6知识点

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

你听___ ⋅ 05/08 ⋅ 0

JAVA SE常用资料

Hibernate3.2中文文档CHM 下载地址:http://www.ziddu.com/download/7798787/Hibernate3.2chinesehelp.chm.html thinking in JAVA中文第四版.chm: 下载地址:http://www.ziddu.com/download......

asdtiang ⋅ 2010/02/22 ⋅ 0

慕课SpringMVC从入门到精通系列

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

HenrySun ⋅ 2016/10/08 ⋅ 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 ⋅ 0

恒宇少年/spring-boot-chapter

简书整套文档以及源码解析 专题 专题名称 专题描述 001 Spring Boot 核心技术 讲解SpringBoot一些企业级层面的核心组件 002 Spring Cloud 核心技术 对Spring Cloud核心技术全面讲解 003 Quer...

恒宇少年 ⋅ 04/19 ⋅ 0

【原创】《深入剖析Tomcat》读书笔记

第一章 一个简单的Web服务器 第二章 一个简单的servlet容器 第三章 连接器 第四章 Tomcat的默认连接器 第五章 servlet容器 第六章 生命周期 第七章 日志记录器 第八章 载入器 第九章 Sessio...

pandudu ⋅ 2015/12/22 ⋅ 0

2016-2017学年第二学期C++第五章(1)

C++ 上机课参考答案 本系列文章供北京邮电大学信通院及数媒学院「C++高级程序语言设计」上机课学生参考。 2016-2017学年第二学期C++第五章(1) 1509.VC++实验5.1 温度转换 1510.VC++实验5.2...

u013594828 ⋅ 2017/04/30 ⋅ 0

算法-第四版习题索引汇总

算法-第四版习题索引汇总 持续更新中。。。 第一章 基础 算法-第四版-1.1 基础编程模型-习题索引汇总 算法-第四版-1.2 数据抽象-习题索引汇总 算法-第四版-1.3 背包、队列和栈-习题...

himayan46 ⋅ 2016/09/28 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

对于程序员的招聘问题,作为软件人的一些吐槽和建议

作为软件人,找工作有时候似乎挺苦逼的。 说真的,让我去掉前面这句中“似乎”二字吧。就是苦逼!很多人都曾抱怨处在招聘的一方很糟糕——我们没有任何可靠的方式来甄别会写代码并且写得好的...

老道士 ⋅ 36分钟前 ⋅ 0

HDFS原理学习

一、概述 1、 Hadoop整合了众多的文件系统,首先提供了一个高层的文件系统抽象org.apache.hadoop.fs.FileSystem。然后有各个文件系统的实现类。 2、Hadoop是JAVA编写的,不同文件系统之间的交...

cjxcloud ⋅ 40分钟前 ⋅ 0

Linux下MySQL表名不区分大小写的设置方法(抄袭别人的)

Linux下MySQL表名不区分大小写的设置方法 MySQL表名不区分大小写的设置方法 在用centox安装mysql后,把项目的数据库移植了过去,发现一些表的数据查不到,排查了一下问题,最后发现是表名的大...

随风而浮沉 ⋅ 45分钟前 ⋅ 0

ubuntu下安装宋体simsun

sudo cp simsun.ttc /usr/share/fonts cd /usr/share/fonts sudo chmod 644 simsun.ttc 更新字体缓存: 代码: sudo mkfontscale 代码: sudo mkfontdir 代码: sudo fc-cache -fsv 安装chrome扩......

wangxuwei ⋅ 46分钟前 ⋅ 0

利用 ssh 传输文件

Linux 下一般可以用 scp 命令通过 ssh 传送文件: #把服务器上的 /home/user/a.txt 发送到本机的 /var/www/local_dir 目录下scp username@servername:/home/user/a.txt /var/www/local_dir...

大灰狼时间 ⋅ 56分钟前 ⋅ 0

web3j教程:android和java程序员如何使用web3j开发区块链以太坊

如何使用web3j为Java应用或Android App增加以太坊区块链支持,本教程内容即涉及以太坊中的核心概念,例如账户管理包括账户的创建、钱包创建、交易转账,交易与状态、智能合约开发与交互、过滤...

智能合约 ⋅ 今天 ⋅ 0

web3j开发java或android以太坊智能合约快速入门

web3j简介 web3j是一个轻量级、高度模块化、响应式、类型安全的Java和Android类库提供丰富API,用于处理以太坊智能合约及与以太坊网络上的客户端(节点)进行集成。 可以通过它进行以太坊区块链...

笔阁 ⋅ 今天 ⋅ 0

一起读书《深入浅出nodejs》-异步I/O

异步I/O “异步”这个名词其实很早就诞生了,但它大规模流行却是在Web 2.0浪潮中,它伴随着AJAX的第一个A(Asynchronous)席卷了Web。 为什么要异步I/O 关于异步I/O为何在Node里如此重要,这与...

小草先森 ⋅ 今天 ⋅ 0

JVM各种问题

1、如果启动什么都不设,会怎样? 先来看一个命令 [root@localhost bin]# java -XX:+PrintCommandLineFlags -version -XX:InitialHeapSize=29899008 -XX:MaxHeapSize=478384128 -XX:+PrintCo......

算法之名 ⋅ 今天 ⋅ 0

SAS笔记-宏2

宏是一种文本,一般来说其编译是在程序执行之前。 宏变量的创建 %let语句 %let macro_variables = text; %let是常见的宏变量建立方式,其编译就在执行前。如下例中,想要宏变量test等于数据集...

tonorth123 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部