《java编程思想》学习笔记二 java的finalize内存回收

本文探讨了Java中`finalize()`方法在内存回收过程中的作用,强调它不是析构函数,而是在垃圾回收前可能被调用来进行资源清理。垃圾回收机制包括停止-复制和标记-清扫两种方式,前者避免碎片但可能导致程序暂停,后者则可能导致非连续的内存空间。`System.runFinalizersOnExit()`方法可以在应用退出时强制执行`finalize()`,但这可能导致显著的延迟。

一旦垃圾回收器准备释放内存资源的时候首先调用finalize()方法,并在下一次动作真正发生之前才会真正回收对象所占内存,finalize()做的事一些清理工作。有以下特点:

1 垃圾回收只与内存有关

2 对象可能不被垃圾回收

3 垃圾回收不是析构函数

4, 只要程序没有濒临内存耗尽的那一刻,对象占用的资源总得不到释放.直到程序结束后才彻底释放资源


finalize()方法的通用格式如下:

protected void finalize( )
{
// finalization code here
}


finalize() 是一个用于释放非 Java 资源的方法。但是,JVM 有很大的可能不调用对象的finalize() 方法.Java 1.1 通过提供一个System.runFinalizersOnExit() 方法部分地解决了这个问题。不象System.gc() 方法那样,System.runFinalizersOnExit() 方法并不立即试图启动垃圾回收器。而是当应用程序或 Applet 退出时,它调用每个对象的finalize() 方法。通过调用System.runFinalizersOnExit() 方法强制垃圾回收器清除所有独立对象的内存,当清除代码执行时可能会引起明显的延迟。


垃圾回收器工作方式:

停止----复制   先暂停运行程序,吧需要的对象复制搬迁出来,然后删除掉之前的内存空间,这样可以避免碎片的出现,复制出来的对象可以放在一个连续的内存空间中

标记----清扫   从堆栈和静态存储区出发,遍历所有引用,找出所有存活的对象,所有标记的对象不被回收。  这样有个缺点就是回收过后的内存空间是不连续的,如果想得到连续的对象就得要重新整理了





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值