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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© suiabing 中级黑马   /  2012-4-28 22:35  /  2047 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

学java前面的时候就说过垃圾回收机制,当我们创建对象的时候系统会给这个对象分配内存,当对象不再使用的时候,垃圾回收机制会在不定时期回收这个对象。但是后面有加了一句,垃圾回收只负责回收对象,不负责回收物理资源?这个不定时是什么时候呢,?我们new了一个Person();怎么知道不再被调用呢?回收对象和回收内存是不是一个概念?

5 个回复

倒序浏览
垃圾回收机制只针对堆中的东西有用这堆里的东西可以随时变化,而栈里的东西生命期会随着执行逐渐消失不具有可扩展性对象就存在堆中,栈也用内存,所以垃圾回收区别对待只收对象,,至于这个不定时那就看jvm了.
回复 使用道具 举报
你指的物理资源是什么?是指内存么?不定时就是随机,JVM会随机回收不用的对象,回收的时间是不确定的。当new一个Person时,没给定引用变量指这个Person对象,JVM就会认为这个person对象是要作为垃圾回收的对象。比如Person p = new Person();Perosn p1= new Person("LiSi",23);p=p1;p和p1都是指向Person类对象的引用变量,p指向了p1所指向的对象,这样一来p以前指向的对象,就没有引用变量指向它,它就不能再被调用,JVM认为它是一个垃圾对象。回收对象和回收内存是不是一个概念,回收对象只不过是回收内存一种方式。只有是释放内存的动作,都称为回收内存,如释放变量,方法出栈等等都是回收内存。
回复 使用道具 举报
垃圾回收机制回收堆内存中那些无用的,不再使用的对象,垃圾回事的时机是不确定的。
当我们使用 Person p = new Persion()时,在栈内存中的p变量持有了Persion对象的引用,这个就是强引用,也就是P一直会持有该对对象的应用。
当把p=null时,也就是释放了Persion对象的引用,该persion对象会在对内存中变成垃圾,此时,垃圾回收机制也并不会立刻回收该对象,至于什么时候回收,
垃圾回收机制是一个单独的线程,只有当他获得cpu时,他才会运行,才回去检查是否有垃圾对象,有就会回收。
回复 使用道具 举报
Java的堆是一个运行时数据区,类的实例(对象)从中分配空间。Java虚拟机(JVM)的堆中储存着正在运行的应用程序所建立的所有对象,这些对象通过new、newarray、anewarray和multianewarray等指令建立,但是它们不需要程序代码来显式地释放。一般来说,堆的是由垃圾回收 来负责的,尽管JVM规范并不要求特殊的垃圾回收技术,甚至根本就不需要垃圾回收,但是由于内存的有限性,JVM在实现的时候都有一个由垃圾回收所管理的堆。垃圾回收是一种动态存储管理技术,它自动地释放不再被程序引用的对象,按照特定的垃圾收集算法来实现资源自动回收的功能。

回复 使用道具 举报
对象只要有引用,如果某个对象的引用已经不在它的范围中,但此引用还在,则此对象就会继续保留在堆上。如果对对象的唯一引用消失时,对象就会从堆中释放,引用变量会跟堆栈快一起解散。
public class StackRef{
        public void foof(){
                barf();
        }
        public void barf(){
                Duck d = new Duck();
        }
}
新的Duck会放在堆上,barf()还在运行,d就还在,只要barf()执行完毕,d就要被垃圾回收器回收。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马