扯扯Java中Finalization的意义
这是Stack Overflow上关于Finalizetion意义的两段讨论,这两个观点是互为补充的。
观点1:
垃圾回收器(The garbage collector)自动在后台运行(虽然它也可以被直接调用,但是一般不这么干),基本上它就是清理那些没有被其他对象引用的对象。(垃圾回收器的整个工作原理要比上面说的复杂,但基本就是这样)。所以它不会改变活动对象(live object)上的任何引用。如果一个对象不能被其他活动对象引用(can not be accessed),那么就意味着它可以被安全地回收。
Finalizetion主要用来释放被对象占用的资源(不是指内存,而是指其他资源,比如文件(File Handle)、端口(ports)、数据库连接(DB Connection)等)。然而,它不能真正有效地工作。
●finalize()的调用事件是不可预知的。
●事实上,没有机制能保证finalize()一定会被调用。
但是即使finalize()被保证一定会被调用,它也不是一个释放资源的好地方;当它被调用准备清理所有你打开的数据库连接(DB Connections)时,系统可能已经耗尽了所有空闲的连接,然后你的app就不能继续跑了。
观点2:
一旦垃圾回收器运行(VM决定它什么时候需要清理内存,你不能强迫它运行)并决定从某个对象(this object)中回收内存时(这意味着已经没有引用(reference)指向这个对象,至少它不是可达(reachable)的对象),在它删除这个对象占用的内存时,它将调用对象上的finalize()方法。你可以肯定的是如果进行了垃圾回收,那么在对象消失(dispperars)前finalize()方法会被调用,但你无法确定它是否会被GC回收,所以你不能依赖这个方法做清理工作。你应该在finally{}里面做清理工作,不要使用finalize()方法,因为它不一定保证会被运行。
从以上观点总结:GC是用来回收对象占用的内存的,而finalize()这个东西会被finalizer调用,用来回收资源(文件、端口、数据库连接等)。
本文内容翻译自What is the purpose of Finalization in java?
扯扯Java中Finalization的意义的更多相关文章
- java中final的意义
1.如果一个数据既是static又是final,那么它会拥有一块无法改变的存储空间. 2.final data: 当final用于基本数据类型时,final让其值(value)保持不变,但是当用于ob ...
- [转]Java中this的意义
1. this 指的不是成员变量还是方法里的参数值指得是这个类自身 class a{int i = 0;public void aa(){System.out.print(i);}public voi ...
- java中+=与+的区别
public class QQ { public static void main(String[] args) throws ParseException { byte val1 = 5; doub ...
- 扯扯Java中的锁
前言 又过去了一个周末,最近陆陆续续的看了<并发编程的艺术>一书,对锁有不少感悟,这次就聊聊Java中的锁事.本文纯粹是漫谈,想到哪说到哪,但准确性肯定会保证,倘若有不正确之处,还请交流指 ...
- [转]Java中fina以及static的意义
一.final 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效 ...
- Java中的抽象类详解,它存在的意义在哪里?
学习抽象类前先理解下面这段话: 问你个问题,你知道什么是"东西"吗?什么是"物体"吗? "麻烦你,小王.帮我把那个东西拿过来好吗" 在生活中 ...
- Java与Python中的‘%’运算符意义一样么?
1. 取余与取模 百度百科对于取模运算做了如下定义: 对于整型数a,b来说,取模运算或者求余运算的方法都是: 1.求 整数商: c = [a/b]; 2.计算模或者余数: r = a - c*b. 求 ...
- Java中的关键字有哪些?「Java中53个关键字的意义及使用方法」
Java中的关键字有哪些? 1)48个关键字:abstract.assert.boolean.break.byte.case.catch.char.class.continue.default.do. ...
- Java 中的纤程库 – Quasar
来源:鸟窝, colobu.com/2016/07/14/Java-Fiber-Quasar/ 如有好文章投稿,请点击 → 这里了解详情 最近遇到的一个问题大概是微服务架构中经常会遇到的一个问题: 服 ...
随机推荐
- Django web 基础
一.Django概述 Django大而全; 创建Django工程:django-admin startproject sitename 创建django之后生成的目录结构如下: Project Pro ...
- jquery移动端日期插件
不说多的,直接看代码<!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- spring junit
转载自 http://blog.csdn.net/funi16/article/details/8691575 在写单元测试的时候,一般是对数据库进行增删改查的操作,这个时候,如果之前删除了某条记录, ...
- HDU 4819 Mosaic (二维线段树)
Mosaic Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others)Total S ...
- 修改Tomcat根目录
在server.xml文件中找到</Host>标签,在之前加入这样一行:<Context path="" docBase="F:/MyWeb" ...
- oracle学习-存储过程返回一个值,和返回一个结果集
一.返回一个值 --创建存储过程 create or replace procedure sp_hu_test(spcode in varchar2,spname out varchar2)is be ...
- Sum All Odd Fibonacci Numbers
function sumFibs(num) { //return num; var arr = [1,1]; var add = 2; while(true){ var item = arr[0] + ...
- 如何通过maven ,将本地jar 安装到仓库中去。
场景: 现在很多公司,都有 maven 的私服 ,在maven项目中,基本上有两个仓库 ,一个是maven的公共仓库,一个是私服仓库: 有的时候,我们download 别人的代码的时候,pom文件中报 ...
- nginx 的基础配置[转]
nginx 的基础配置 分类: 工具软件2013-11-13 23:26 11人阅读 评论(0) 收藏 举报 目录(?)[-] 管理配置文件 全局配置 虚拟机server配置 location配置 ...
- Infobright存储引擎的特点
Infobright的优点: (1)高压缩比率 (2)快速响应复杂的分析查询语句 (3)随着数据库的逐渐增大,查询和装载性能基本保持稳定 (4)没有特殊的数据仓库模型(比如星状模型.雪花模型)要求 ( ...