作者: 付左军 时间: 2012-5-10 00:26
没用的时候,没有任何引用指向的时候 作者: 黑马-王建雨 时间: 2012-5-10 01:26
当该对象没有谁在使用它时,jvm自动清理之,JVM独立工作、自己干活,不和咱写的代码牵扯。晚安作者: 小小企鹅 时间: 2012-5-10 09:20
当Java虚拟机启动时,会从底层操作系统取得一块内存,并以此区段来执行Java程序。
对象的生存空间堆heap存放所有的对象,方法调用及变量的生存空间stack存放方法调用和局部变量
public class TestLifeOne{
public void read(){
int s = 42; //s的范围只限与read()里面,别处无法使用
sleep();
}
public void sleep(){
s = 7; //sleep()无法存取s变量,因为它不在sleep()的堆栈快中
}
}
对象只要有引用,如果某个对象的引用已经不在它的范围中,但此引用还在,则此对象就会继续保留在堆上。如果对对象的唯一引用消失时,对象就会从堆中释放,引用变量会跟堆栈快一起解散。
有3种方法可以释放对象的引用:
引用永久性的离开它的范围:
void go(){
Life z = new Life(); //z会在方法结束时消失
}
引用被赋值到其他的对象上:
Life z = new Life();
z = new Life(); //第一个对象会在z被赋值到别处是消失
直接将引用设定为null:
Life z = new Life();
z = null;
作者: 黄坚声 时间: 2012-5-10 17:05
回收机制就是 当一些资源被创建使用之后或不在调用的话 就会变成垃圾,垃圾的话会占用空间,这时候就需要释放空间给其他程序使用,所以JAVA拥有自动垃圾回收机制,会在适当的时候自动调用垃圾回收 释放资源,程序员也可以手动调用释放资源等等。
如:
public class A {
String str;
public A(String str){
this.str=str;
}
public String toString(){
return str;
}
@Override
protected void finalize() throws Throwable {
System.out.println("我是"+str+".我被回收了..");
}
public static void main(String[] args) {
A a=new A("红牛帮老大");
a=null;
System.gc(); //运行结果 我是红牛帮老大.我被回收了..
}
} 作者: 荣天 时间: 2012-5-10 17:13
没有对象指向它 等待垃圾回收机制处理作者: 黄坚声 时间: 2012-5-10 21:45
对象创建之后,如果还在被使用当中,它是不会被回收的,因为它还不是垃圾;
当对象不再被使用的时候,就会变成垃圾,java虚拟机将根据垃圾自动收集机制回收垃圾。
至于,何时回收,这个java没有严格的规定时间。最多只能建议虚拟机尽快回收垃圾。