准备OCJP的考试中,有这样一道题目,要求分析在下面的代码第8行,和第18行,分别有多少的对象,可以被GC回收...请高手帮忙分析一下,谢谢!下面的代码中,答案说是第8行,有三个对象可以被GC回收,我的问题是:1) 我不太理解其中的static Fiji base,所有的静态全局变量,都是放在方法区,被所有线程共享,也就是说,它在类加载后,就一直存在,直到程序运行完毕,也就是main()运行完?
2) new Fiji().go();中的匿名对象什么时候可以被回收呢?它没有办法强制断开引用,是不是也是main()运行完才可以回收?3. public class Fiji {
4. static Fiji base;
5. Fiji f;
6. public static void main(String[] args) {
7. new Fiji().go();
8. // do more stuff
9. }
10. void go() {
11. Fiji f1 = new Fiji();
12. base = f1;
13. Fiji f2 = new Fiji();
14. f1.f = f2;
15. Fiji f3 = f1.f;
16. f2.f = f1;
17. base = null; f1 = null; f2 = null;
18. // do stuff
19. } }//答案:第8行有3个对象可以被GC回收;第18行没有对象可以被GC我粗略地画个一下内存分析图,放在最后,请帮忙看一下是否正确.----其中,两张图,我认为所有的变量(f1,f2,f3, new Fiji(),以及他们的f),都引用了static Fiji base,图上没体现出来。....我有点儿乱go()main()OCJPgc

解决方案 »

  1.   

    栈区:在函数中所创建的变量(局部变量)。(当程序执行到相应代码位置时,才会创建)(变量所在的函数结束时释放空间)
    全局数据区:字符串常量,静态变量。(只要程序运行,就会创建完相应的内存空间)(整个程序结束时释放空间)
    堆区:通过new这个关键字来创建的变量,开辟的内存空间(动态存储空间)(遇到new关键字就创建内存空间)(垃圾回收器释放)  类中定义的成员变量也是存储在堆区中的。按照这个思路来,大致上能弄清楚内存的创建和回收了。
      

  2.   

    整理一下,如果有错误,请指正,先谢啦!1) 静态变量不存在回收的问题...本例中static Fiji base,从类加载开始,是一直存在的,直到程序运行完毕。
    2) go()方法内,也就是18行,不存在可以回收的对象,是因为强制f3仍然有引用,它链式地指向了另外一个对象
       假如说在17行,f3=null,那么,18行可以GC
      

  3.   

      假如说在17行,f3=null,那么,18行可以GC的对象将是2个?还是4个?
      

  4.   

    假如说在17行,f3=null,那么,18行可以GC的对象应该是2个,因为f3.f又引用了f2;而f2.f又引用了f1。第8行,将GC三个对象,即go()方法里,NEW出来的2个对象,外加main()里NEW出来的匿名对象
    匿名对象存在于HEAP,堆里没有任何变量引用指向它,它只能应用一次,然后被GC..上述理解,如果有错误,请高手纠正,谢谢!