我自己琢磨了下,也觉得应该在乙处,才能释放b指向的内存空间,在甲处,对b的引用还是存在的。顺便问一下熟悉c/c++的朋友,如果再c++中的类似情况里(没有delete b的动作)在乙处会是释放b对应的内存吗?

解决方案 »

  1.   

    bigcrazy(大疯狂):
    我知道
    //--
    圾回收的时间是无法预见的,而且是自动进行的
    //--
    所以我的例子中有System.gc();来显示的调用垃圾回收,我是想确定当垃圾回收发生在以上代码执行到甲、乙两处时是否认为b的引用存在,是否会回收b指向的空间。
      

  2.   

    改一改就可以看到在哪里回收的了,在乙处。
    class TestGC {
    public static void main(String[] args) {
    A a=new A();
    a.foo();
    System.out.println("乙处垃圾回收:");
    System.gc();//乙处垃圾回收
    a.foo1();
    }}class  A {
    public A(){} 
    public void foo() {
    B b=new B(); 
    b.foo();
    //本函数中再也没有使用过B
    System.out.println("甲处垃圾回收:");
    System.gc();//甲处垃圾回收
    }
    public void foo1(){};}class B
    {
    public B(){}
    public void foo()
    {
    //do something;
    }
    public void finalize() {
    System.out.println("finalizing...");
    }
    }圾回收的时间是无法预见的,而且是自动进行的;如果调用System.gc()那么便会执行对象的finalize()函数(如果对象有的话)。
      

  3.   

    你问的问题和你所举的例子有点不太一致哟!
    System.gc();是你知道要干什么的,而“任何类只要不再被引用”是计算机内部的!
    他的意思是说,当前对象引址不在指向对象了,这时系统会自动回收的!!
      

  4.   

    本人愚钝,楼上说的,我没看明白!
    //--
    圾回收的时间是无法预见的,而且是自动进行的;如果调用System.gc()那么便会执行对象的finalize()函数(如果对象有的话)。
    //--
    是不是说在乙处,b已经没有在被引用了,如果程序执行到此时进行了垃圾回收的话,则可以收回b以前指向空间就可以被回收了。
    调用System.gc()不等于进行垃圾回收,是吗?
      

  5.   

    如果System.gc()被唤起,那么Finalization便会发生在所有的对象身上。但是,只有当System.gc()被唤起于“所有对象被产生并被弃置”之后,所有的finalizes才会被调用。调用System.gc()就是进行垃圾回收,但是垃圾回收不等于C++中的解构(destruction)。
      

  6.   

    在甲处肯定不会被回收,因为变量b没有出作用域(包含他的小的{},在for()中的是for{}范围),变量b还存在,他引用的实例还没有被悬空,因此不会被悬空,在已处时,b变量已经出了作用域,变量被归还给堆中,他原来所指的实例被悬空,就表示随时会被回收。在需要说明的是System.gc(),他不是要求系统回收,而是建议系统回收,JVM具体什么时候回收并归还内存,根据作业(进程或线程)的优先级调度具体完成,如果你想他尽快回收,可以在启动JAVA的时候带参数来提高回收作业的优先级,方法是:java -Xincgc javaapplication.class(X是大写的)