你指的物理资源是什么?是指内存么?不定时就是随机,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时,他才会运行,才回去检查是否有垃圾对象,有就会回收。
对象只要有引用,如果某个对象的引用已经不在它的范围中,但此引用还在,则此对象就会继续保留在堆上。如果对对象的唯一引用消失时,对象就会从堆中释放,引用变量会跟堆栈快一起解散。
public class StackRef{
public void foof(){
barf();
}
public void barf(){
Duck d = new Duck();
}
}
新的Duck会放在堆上,barf()还在运行,d就还在,只要barf()执行完毕,d就要被垃圾回收器回收。