黑马程序员技术交流社区

标题: 对象创建之后是何时被回收的? [打印本页]

作者: It's_Zero    时间: 2012-5-9 15:51
标题: 对象创建之后是何时被回收的?
对象创建之后是何时被回收的呢?
作者: 赵玮_Tom    时间: 2012-5-9 16:03
当没有任何引用指向该对象时,该对象被称为垃圾。由垃圾回收机制不定期对其进行回收。
需要说明的是:垃圾回收机制由虚拟机自主控制,不受程序代码影响。即使在程序中有System.gc();的代码,也不一定会立即调用垃圾回收功能,只在JVM认为需要进行清理的时候才会对内存中的垃圾对象进行回收。
作者: HeiMaYSL    时间: 2012-5-9 16:22
在java中, java虚拟机有自己的垃圾回收站机制,它和java代码互不影响,就是两个线程一样。
如果当一个对象,没有任何指向时,这时,就算是垃圾了。那么,java在运行时,就会自动清理掉这样的垃圾,而减缓内存的负担。
作者: 索学超    时间: 2012-5-9 16:55
综上所述:
1、对象的回收是由JVM负责的。
2、对象的回收是由JVM在不确定的时间执行
3、对象回收的前提是这个对象实例再也没被调用,成了没人要的孩子的时候
4、.......
作者: 索学超    时间: 2012-5-9 16:55
综上所述:
1、对象的回收是由JVM负责的。
2、对象的回收是由JVM在不确定的时间执行
3、对象回收的前提是这个对象实例再也没被调用,成了没人要的孩子的时候
4、.......
作者: 李啸    时间: 2012-5-9 18:19
对象在被创建后有两种回收的可能 一种是在程序运行中长时间不去用那个对象 在Java虚拟机空闲时回去回收那个对象还有一种就是类被注销了 对象也就不存在了
作者: 永恒之翼网络    时间: 2012-5-9 20:25
当没有任何引用变量指向该对象时,JVM便认为该对象是垃圾,会随机调用垃圾回收站回收该对象。看下面的图就清楚了:

dx.jpg (630.35 KB, 下载次数: 39)

dx.jpg

作者: 付左军    时间: 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没有严格的规定时间。最多只能建议虚拟机尽快回收垃圾。




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