黑马程序员技术交流社区

标题: java内存回收机制? [打印本页]

作者: zly1992008    时间: 2014-6-5 15:38
标题: java内存回收机制?
本帖最后由 zly1992008 于 2014-6-6 09:57 编辑

回收机制以及如何知道对象被回收?
作者: yinxjfly    时间: 2014-6-5 16:54
这么高深的问题没有研究过!
作者: 阿苏勒    时间: 2014-6-5 17:19
对象被创建,就会在java虚拟机的堆区拥有一块内存,但是在java虚拟机工作时期,可能会有很多对象会被创建,所以如果对象都永久性的占用内存,资源就会被消耗。
java虚拟机就有了内存回收的任务,内存回收的过程称为垃圾回收。

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

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

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


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

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

作者: 黄梁梦想享    时间: 2014-6-5 17:24
学习到了,谢谢
作者: zly1992008    时间: 2014-6-6 09:56
阿苏勒正解了,正是Object的finalize()方法。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2