调用System.gc(),没测试出来,大家来讨论下~

解决方案 »

  1.   

    static的是属于类的,而不是属于对象的,相当于是全局的,怎么可能会被回收
      

  2.   

    你用System.gc(),并不一定GC马上回收垃圾,用System.runFinalizersOnExit()试一下
      

  3.   

    一个对象会不会被回收,主要看垃圾回收器引用遍历的时候能不能访问到这个引用,如果访问不到,则将被回收,如果能够访问到,则不能回收。
    如果一个类的class文件被装载,那么它的静态成员变量便会被初始化,除非unloader这个类的class对象,他的静态成员变量是不会被gc的
      

  4.   

    全局变量始终会有一个Class 对象的句柄指向它除非这个Class对象要被回收了否则静态变量是不会被GC掉
      

  5.   

    声明
    static Vector pane = new Vector();然后
    pane = null;如果没有其它引用的话,原来pane指向的对象实例就会被回收。据我所知没有办法测试。因为,只要别的地方也存在该Vector对象的引用,那么就不符合回收标准;如果都没引用了,你也无法判断该Vector对象是不是真的从内存里回收了。所以,就相信JVM的GC吧。
      

  6.   

    恩,楼上的诸位说的都是,我仔细想了想,应该不会被回收,他不是被分配在heap里,生命周期应该是在JVM结束时
      

  7.   

    收回 什么??
    static 又不是在 heap上分配的
      

  8.   

    晕,对象都是在heap上的!
    你不把对象的引用设为null,GC永远不会回收。
      

  9.   

    楼上的 pane 是对象的引用,分配在栈中.
    回收的一般是通过new产生在堆上的对象.
      

  10.   

    我的观点:1)静态变量本身不会被回收
    2)静态变量所引用的对象是可以回收的。第一点大家应该没有疑问,下面我证明第2点:看下面的例子及注释。自己可以运行试一下, 注意加上-verbose:gc参数java -verbose:gc TestStaticGc// TestStaticGc.java
    public class TestStaticGc {
        // ia是一个静态变量,在这里它作为一个int数组的引用。
        static int[] ia = new int[1024 * 1024];
        
        public static void main(String[] args) {
            int i = 0;
            // 为了清楚,我用了6次循环,每次都调用System.gc();
            // 在第3次循环时,我把ia的引用设为null。
        // 如果ia指向的对象能被回收的话,应该有明显的内存减少现象。
            do {
                if (3 == i++) {
                    ia = null;
                    System.out.println("release");
                }
                System.gc();
            } while (i<6);
        }
    }现在看结果:
    ---------- java ----------
    // 前两次是每个应用初始化之后都要做的。
    [GC 328K->162K(1984K), 0.0043279 secs]
    [Full GC 162K->162K(1984K), 0.1501831 secs]
    // 下面是调用System.gc()的结果
    [Full GC 4267K->4258K(6084K), 0.0234695 secs]  // i = 0
    [Full GC 4268K->4258K(7676K), 0.0235161 secs]  // i = 1
    [Full GC 4258K->4257K(7676K), 0.0299952 secs]  // i = 2
    release // 静态变量设为null
    // 看,明显的内存变化。
    [Full GC 4266K->161K(7676K), 0.0234256 secs]   // i = 3
    [Full GC 161K->161K(7676K), 0.0233586 secs]    // i = 4
    [Full GC 161K->161K(7108K), 0.0238793 secs]    // i = 5结论:
    我的观点正确。结果:
    楼主给分吧
      

  11.   

    stack 里应该是不会被回收的, heap是会的。
      

  12.   

    对象的回收和是否static没有什么关系!
    对象都是一样的,只要没有对它的引用,就可以被回收(但是不一定被回收).static只是说这个对象属于类实例变量,引用是一直存在,被引用的对象当然可以改变.
    只要其他地方都没有引用它,就可以被回收.
      

  13.   

    stack里对象需要回收吗? 方法返回什么都没有了
    况且stack里面有对象吗? (stack分配对象需要在编译时知道对象的大小)
      

  14.   

    纠正一些错误的说法。static变量同样是再heap上分配空间的。也会北回收,当这个类不需要再用到时,虚拟机就会回收这个类再heap中分配的控件,同时他的static变量肯定也会被回收(这个static变量唯一被引用)。