A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zly1992008 中级黑马   /  2014-6-5 15:38  /  1053 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 zly1992008 于 2014-6-6 09:57 编辑

回收机制以及如何知道对象被回收?

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

4 个回复

倒序浏览
这么高深的问题没有研究过!
回复 使用道具 举报
对象被创建,就会在java虚拟机的堆区拥有一块内存,但是在java虚拟机工作时期,可能会有很多对象会被创建,所以如果对象都永久性的占用内存,资源就会被消耗。
java虚拟机就有了内存回收的任务,内存回收的过程称为垃圾回收。

通常堆区的对象都有三个状态:
1,可触及状态。对象创建后,只要程序中还有引用变量引用它,就属于这个状态。

2,可复活状态:程序中不再有引用变量引用该对象,它就进入了可复活状态,在这个状态,垃圾回收器会准备释放它占用的内存,释放之前,会调用它以及其他处于可复活状态的finalize()方法,该方法可能会使对象重新回到可触及状态。

3,不可触及状态:当对可复活状态的对象调用了finalize()方法后,如果该对象还没有转到可触及状态,那么该对象就会进入不可触及状态。就等着垃圾回收器来回收。


我看书上说,当一个对象处于可复活状态,垃圾回收线程何时执行它的finalize()方法,何时使它转到不可触及,何时回收占用的内存。这对程序都是透明的。
这好比我们丢垃圾,我们放到门外就可以,垃圾怎么收走,我们是不知道的。

这里还说说,Object类中的finalize()方法的特点。
1,由于是超类中的方法,所以任何类都可以复写。
2,垃圾回收器如果调用对象的finalize()方法时,发生异常,垃圾回收器不会报告异常,程序正常运行。
3,垃圾回收器是否会执行或何时执行该方法,都是不确定的。

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
学习到了,谢谢
回复 使用道具 举报
阿苏勒正解了,正是Object的finalize()方法。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马