黑马程序员技术交流社区

标题: 请问JAVA垃圾回收机制 [打印本页]

作者: 占琳    时间: 2012-10-20 17:34
标题: 请问JAVA垃圾回收机制
如题,系统如何判定一个对象不需要存在将其回收
作者: 孙含庆    时间: 2012-10-20 17:48
系统GC 垃圾处理一直在监视你的程序,当你把某个不用的对象释放掉,也就是 对象=null 时,GC 发现这个对象被释放了,他就回收这个对象的空间。GC 什么时候出来干活是不确定的,但是还是要尽早的把不用的对像释放掉,降低程序运行空间,提高程序运行效率。
作者: 奋斗的青春    时间: 2012-10-20 17:52
java垃圾回收就是 系统自动把heap(堆)中没有引用指向的对象定期删除
这个是定期自动调用,一般不用去考虑回收的时间点,另外,如果heap中对象比内存多,这时是会报错的。
JAVA垃圾回收机制另一个特点是,进行垃圾回收的线程是一种低优先级的线程,在一个Java程序的生命周期中,它只有在内存空闲的时候才有机会运行。

垃圾回收线程遵循以下两个特性。
1.  自动性。Java技术提供了一个系统级的线程,即垃圾收集器线程,来跟踪每一块分配出去的内存空间,当Java 虚拟机处于空闲循环时,垃圾收集器线程会自动检查每一块分配出去的内存空间,然后自动回收每一块可以回收的无用的内存块。
2.  不可预期性。一个对象成为了垃圾,但是你不能断言,该对象在这行以后就立刻被清除,甚至有可能当程序结束后,该对象仍然占用内存。像Windows这样的软件常常会出现内存不足的情况,JAVA程序很少出现就是因为可以自动回收内存。然而,因为JAVA也不能保证及时地清除无用的对象,所以JAVA程序也会出现内存不足的情况,只是这种情况很少出现。垃圾收集线程在一个Java程序中的执行是自动的,不能强制执行,即使程序员能明确地判断出有一块内存已经无用了,是应该回收的,程序员也不能强制垃圾收集器回收该内存块。程序员唯一能做的就是通过调用System.gc 方法来"建议"执行垃圾收集器,但其是否可以执行,什么时候执行却都是不可知的。
作者: 给生活加点料    时间: 2012-10-20 18:27
个人感觉这个判断首先是看你数据存储在哪里。如果是栈中,当数据运行完后会马上执行回收机制,将其释放。
如果是在堆中,垃圾回收机制会随机的去处理不用的数据。
作者: 任雷彬    时间: 2012-10-21 23:46
对于对象:类加载进内存空间,在堆内存中开辟空间,创建对象,
对象的引用指向对象在堆内存中地址值。
而对象的引用存储在栈内存,而栈内存在使用完毕后会自动消失,当对象引用在栈内存消失,就没有指向
堆内存的地址值,系统就会判定对象没有对象引用,就会被垃圾回收器回收,也可以在使用对象完毕后,
将对象引用设置为null,将其内存回收。
如:

    Person   a= new Person();
a作为对象引用存于栈内存中,当对象使用完毕,a在栈内存中自动消失,没有栈内存指向
对象在堆内存中的地址,系统判定为垃圾被回收。
   也可以  令   a = null;   通知垃圾回收器回收

作者: 唐进    时间: 2012-10-22 00:00
楼上说的很好,垃圾回收原理只要把栈和堆的关系理清了就好理解了!




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